RxJS:我如何将 bindNodeCallback() 视为可以将运算符链接到它的 Observable?

RxJS: How may I treat bindNodeCallback() as an Observable that can have operators chained to it?

出于学习 RxJS 的目的,我正在构建一个小型 node.js 应用程序,尽可能将所有内容放入流中。

第一步,我正在努力加载外部配置 yaml 文件。我见过 fs.readFile 包装在 bindNodeCallback 中的示例,调用时 returns 是一个可观察对象。但是,下面设置的readFile变量仍然是typeof of 'function'。结果,我无法将 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 应该仍然是一个函数,它在执行时执行 return 和 Observable,但是 flatMap 不是 Observable 上的方法那是 returned。如果你摆脱对 .flatMap() 的调用并直接跳转到 .subscribe(),那就行得通了。

您是在尝试使用 rxjs/operators 中的 flatMap 还是链接界面?


这行得通,但出于某种原因我不得不 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),
  )