javascript - 有没有办法独立处理为多个可观察对象发出的值,然后在所有可观察对象都完成时做一些事情?
问题描述
我正在使用 RXJS 方法,我想处理一个发出的值(当对应的 Observable 完成时),然后在代码的其他地方,跟踪相同的状态Observable
(完成、错误、等待.. .)。
第一步是使用forkJoin
,它工作正常,但我必须等待所有Observable
s 完成才能完成工作,如果我subscribe
使用一个函数getStuff(x)
,则Observable
它被“消耗”并且forkJoin
自然不再使用它。
Observable1 = getStuff(a); // API which returns an observable
Observable2 = GetStuff(b); // API which returns an observable
Observable3 = Getstuff(c); // API which returns an observable
Observable.forkJoin([Observable1, Observable2, Observable3])
.subscribe(result => doStuff(result) )
我需要处理每个Observable
完成时独立发出的所有值,然后,当所有 Observable
s 都完成时,做一些其他的事情。看起来像:
getStuff(a).subscribe( x => doStuffwitha(x) );
getStuff(b).subscribe( x => doStuffwithb(x) );
getStuff(c).subscribe( x => doStuffwithc(x) );
Observable.forkJoin([getStuff(a), getStuff(b), getStuff(c)])
.subscribe( result => doStuff(result) )
我没有使用async
/await
或Promises
RXJS 方法找到合适的解决方案。
有没有办法在不添加新的“人工”承诺或复杂的解决方法的情况下做到这一点,以保持代码的综合性和可读性?
解决方案
我认为您正在寻找的是tap
运算符而不是subscribe
:
import { tap } from 'rxjs/operators';
getStuff(a).pipe( tap(x => doStuffwitha(x)) );
getStuff(b).pipe( tap(x => doStuffwithb(x)) );
getStuff(c).pipe( tap(x => doStuffwithc(x)) );
Observable.forkJoin([getStuff(a), getStuff(b), getStuff(c)])
.subscribe( result => doStuff(result) )
推荐阅读
- spring-boot - 在 Kotlin 中使用带有嵌套属性的 @ConfigurationProperties
- github - GitHub:使用机器人读取 PR 并对该内容进行操作
- javascript - 如何在节点 js 中使用 async/await 和 fs.createReadStream
- c# - 在 if 表达式中初始化和测试对象以缩短其生命周期
- curl - 如何使用 curl 发送换行符?
- google-apps-script - 共享应用脚本项目会导致错误
- c++ - 是否有任何 sqlite API (C API) 替代 BEGIN TRANSACTION 和 COMMIT
- java - 使用 Twilio 进行 Keycloak 电话号码验证
- python-3.x - Pip3 指向错误的 python 版本
- c# - 使用 .Net Core 3.0 并使用 app.config 发布独立的 exe 文件