gpt4 book ai didi

javascript - 在 RxJS 中链接 Observable

转载 作者:IT王子 更新时间:2023-10-29 02:59:10 25 4
gpt4 key购买 nike

我正在学习 RxJS 和 Angular 2。假设我有一个包含多个异步函数调用的 promise 链,它依赖于前一个函数的结果,如下所示:

var promiseChain = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1);
}, 1000);
}).then((result) => {
console.log(result);

return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(result + 2);
}, 1000);
});
}).then((result) => {
console.log(result);

return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(result + 3);
}, 1000);
});
});

promiseChain.then((finalResult) => {
console.log(finalResult);
});

我尝试仅使用 RxJS 而不使用 promises 来做同样的事情,结果如下:

var observableChain = Observable.create((observer) => {
setTimeout(() => {
observer.next(1);
observer.complete();
}, 1000);
}).flatMap((result) => {
console.log(result);

return Observable.create((observer) => {
setTimeout(() => {
observer.next(result + 2);
observer.complete()
}, 1000);
});
}).flatMap((result) => {
console.log(result);

return Observable.create((observer) => {
setTimeout(() => {
observer.next(result + 3);
observer.complete()
}, 1000);
});
});

observableChain.subscribe((finalResult) => {
console.log(finalResult);
});

它产生与 promise 链相同的输出。我的问题是

  1. 我这样做对吗?我可以对上述代码进行任何与 RxJS 相关的改进

  2. 如何让这个可观察链重复执行?即在最后添加另一个订阅只会产生额外的 6,尽管我希望它打印 1、3 和 6。

    observableChain.subscribe((finalResult) => { 控制台日志(最终结果);});

    observableChain.subscribe((finalResult) => { 控制台日志(最终结果);});

    13个6个6

最佳答案

关于promise composition vs. Rxjs,因为这是一个经常被问到的问题,你可以引用一些以前在SO上问过的问题,其中:

基本上,flatMap 等同于 Promise.then

对于你的第二个问题,你是想重播已经发出的值,还是想在新值到达时对其进行处理?在第一种情况下,检查 publishReplay 运算符。在第二种情况下,标准订阅就足够了。但是,您可能需要注意寒冷。与热二分法取决于你的来源(参见 Hot and Cold observables : are there 'hot' and 'cold' operators? 对概念的说明)

关于javascript - 在 RxJS 中链接 Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37771855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com