【问题标题】:RxJs Basing a Filter on Another ObservableRxJs 基于另一个 Observable 的过滤器
【发布时间】:2016-06-06 22:33:02
【问题描述】:

我有一个文本文件中包含发音数据的单词列表。我想做的是让用户输入一个单词,然后让程序检查该文件中是否有关于该单词的数据。我想在 RxJs 中做,我是新手。

下面的代码是最接近我想要的。在我的主流中,我有一个过滤器调用,它创建了一个依赖流,称为“checkstream”。我不明白的是如何在我的主流的过滤方法中使用该依赖流的结果。目前该过滤方法失败,但我仍然通过控制台记录数据将数据显示到屏幕上。

如果我的文本文件中有一个单词的数据,那么检查流最终将成为一个仅包含我想要检索并显示给用户的数据的 observable。我想以某种方式将这些数据传递给我的主流消费者,但我不明白该怎么做。

如果您能提供任何帮助,我将不胜感激。即使只是一些直觉也会很有用。

var Rx = require('rx');
var RxNode = require('rx-node');
var fs = require('fs');
var split = require('split');

    RxNode.fromReadableStream(process.stdin)
        .map( (inputData) => {
            var inputWord = inputData.toString().trim();
            return inputWord;
        })
        .map( (inputWord) => {

            var checkStream = fs.createReadStream('./dict.txt');

            RxNode.fromReadableStream(checkStream.pipe(split()))
                .map( (lineFromFile) => {
                    return JSON.parse(lineFromFile);
                })
                .filter((parsedDataToCheck) => {
                    return parsedDataToCheck.word.toLowerCase().trim() === inputWord; })
                .subscribe((dataThatMatches) => { console.log(dataThatMatches) });

            return dataToReturn;
        })
        .subscribe(function(dataToReturn) {
            console.log(dataToReturn);
        });

【问题讨论】:

    标签: node.js rxjs


    【解决方案1】:

    可能是这样的:

    var Rx = require('rx');
    var RxNode = require('rx-node');
    var fs = require('fs');
    var split = require('split');
    
    RxNode.fromReadableStream(process.stdin).map( 
        inputData => inputData.toString().trim()
    ).flatMap(inputWord => {
        var checkStream = fs.createReadStream('./dict.txt');
        return RxNode.fromReadableStream(
            checkStream.pipe(split())
        ).map(
            lineFromFile => JSON.parse(lineFromFile)
        ).find(
            parsedDataToCheck => parsedDataToCheck.word.toLowerCase().trim() === inputWord
        );
    }).subscribe(dataToReturn => {
        console.log(dataToReturn);
    });
    

    请注意,由于异步 fs 读取,来自 stdin 的输入词可能会在过滤后重新排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 2018-10-11
      • 2019-10-13
      • 1970-01-01
      相关资源
      最近更新 更多