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

问题描述 投票:1回答:1

对于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)
);
node.js rxjs rxjs6
1个回答
1
投票

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),
  )

© www.soinside.com 2019 - 2024. All rights reserved.