对于RxJS学习目的,我正在构建一个小node.js应用程序,它尽可能将所有内容放入流中。
作为第一步,我正在加载外部配置yaml文件。我见过fs.readFile包装在bindNodeCallback中的例子,它在调用时返回一个observable。但是,下面设置的readFile变量仍然是'function'的typeof
。结果,我无法将flatMap链接到它。
在初始化我的应用程序之前,如何重新组织下面的代码来链接bindNodeCallback()和yaml.safeLoad()(它不提供回调)?
const yaml = require('js-yaml');
const fs = require('fs');
const { bindNodeCallback, of } = require('rxjs');
const { mergeMap, map } = require('rxjs/operators');
const configPath = './config/config.yml';
const configEncoding = 'utf8';
const readFile = bindNodeCallback(fs.readFile);
readFile(configPath, configEncoding)
.flatMap(yamlString => of(yaml.safeLoad(yamlString))) // error: .flatMap is not a funciton
.subscribe(
config => {
console.log(config);
// launch the app when config is loaded
},
err => console.error(err)
);
readFile
应该仍然是一个函数,它确实在执行时返回Observable
,但flatMap
不是Observable
返回的方法。如果你摆脱了对.flatMap()
的调用并直接跳到.subscribe()
,那就行了。
你试图使用flatMap
或链接接口的rxjs/operators
吗?
这是有效的,但由于某种原因我不得不yarn add rxjs-compat
。另请注意,我交换使用Observable#pipe()
和flatMap
作为可管道运算符。
const fs = require('fs')
const yaml = require('js-yaml')
const { bindNodeCallback } = require('rxjs')
const { flatMap } = require('rxjs/operators')
const { of } = require('rxjs/observable/of')
const configPath = './config.yml'
const configEncoding = 'utf8'
const readFile = bindNodeCallback(fs.readFile)
readFile(configPath, configEncoding)
.pipe(flatMap(yamlString => of(yaml.safeLoad(yamlString))))
.subscribe(
config => {
console.log(config)
},
err => console.error(err),
)