-1

我经常使用promisify方法,它将带有回调签名(例如fucntion fn(cb) { ... })的方法转换为返回Promise. 它可以使源代码更简洁、更紧凑。到目前为止,一切都很好。

稍有不同的是,具有回调方法的方法,但回调被多次调用。在这种情况下, aPromise无法做到这一点,因为 Promise 只能执行一次。

理论上,这些方法可以返回一个Subject. (例如 a BehaviorSubject)然后会被触发多次。

这让我想知道: 是否有某种subjectify方法可以为我做到这一点?

例如:当有一种方法可以解析大文档时,它可能很有用。要报告其进度,它可以使用回调方法。但是将其包装在 a 中Subject可能更方便。

4

2 回答 2

1

有一些运算符可以帮助您将回调转换为可观察的 https://rxjs-dev.firebaseapp.com/api/index/function/fromEventPattern

但是您可以很容易地集成受回调的影响,如下所示

const progress=new Subject()
myEvent.on('progress', (p)=>{
   progress.next(p)
})
于 2020-03-20T03:28:32.603 回答
0

您可能需要考虑创建一个 Observable,以防您的回调被重复调用,并且您想要通知事件流作为回调被调用的结果。

让我们考虑一下,作为一个例子,节点readline函数,它接受一个回调,该回调会在每行读取时触发,第二个回调会在到达文件末尾时调用。

在这种情况下,我们可以创建一个 Observable,它为读取的每一行发出并在到达末尾时完成,如下例所示

    function readLineObs(filePath: string) => {
        return new Observable(
            (observer: Observer<string>): TeardownLogic => {
                const rl = readline.createInterface({
                    input: fs.createReadStream(filePath),
                    crlfDelay: Infinity,
                });

                rl.on('line', (line: string) => {
                    observer.next(line);
                });
                rl.on('close', () => {
                    observer.complete();
                });
            },
        );
    };
于 2020-03-20T08:52:10.510 回答