【问题标题】:RxJS: How may I treat bindNodeCallback() as an Observable that can have operators chained to it?RxJS:我如何将 bindNodeCallback() 视为可以将运算符链接到它的 Observable?
【发布时间】:2019-08-27 19:56:54
【问题描述】:

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

作为第一步,我正在加载一个外部配置 yaml 文件。我见过 fs.readFile 包装在 bindNodeCallback 中的示例,它在调用时返回一个 observable。但是,下面设置的 readFile 变量仍然是“函数”的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】:

    readFile 应该仍然是一个函数,并且在执行时它确实返回一个 Observable,但 flatMap 不是返回的 Observable 上的一个方法。如果您摆脱对.flatMap() 的调用并直接跳转到.subscribe(),则可以。

    您是尝试使用来自rxjs/operatorsflatMap,还是使用链接接口?


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

    【讨论】:

    • 暂时吸收。谢谢您的回答。主要目标是加载数据,转换为 obj,甚至可能进行验证,然后在完成后传递到下一件事。我还不知道运算符和链接接口之间的区别。
    • 当然 - 如果你愿意,我认为你仍然可以将运算符添加到 Observable 原型,但我认为现在更倾向于使用可管道化的运算符。这可能会对您有所帮助:learnrxjs.io/concepts/operator-imports.html
    猜你喜欢
    • 2018-10-08
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 2018-06-10
    • 2017-04-18
    相关资源
    最近更新 更多