Javascript 有没有一种方法可以独立地处理多个观测值发出的值,然后在所有观测值都完成后再进行处理?

Javascript 有没有一种方法可以独立地处理多个观测值发出的值,然后在所有观测值都完成后再进行处理?,javascript,angular,api,asynchronous,rxjs,Javascript,Angular,Api,Asynchronous,Rxjs,我正在使用RXJS方法,我想处理一个发出的值(当相应的可观测值完成时),然后在代码中的其他地方,跟踪相同的可观测值的状态(完成、错误、等待…) 第一步是使用forkJoin,它工作得很好,但我必须等待所有observatables完成工作,如果我订阅了一个函数getStuff(x),那么observatable将被“消耗”,而forkJoin将不再自然工作 Observable1 = getStuff(a); // API which returns an observable Observab

我正在使用RXJS方法,我想处理一个发出的值(当相应的可观测值完成时),然后在代码中的其他地方,跟踪相同的可观测值的状态(完成、错误、等待…)

第一步是使用
forkJoin
,它工作得很好,但我必须等待所有
observatable
s完成工作,如果我订阅了一个函数
getStuff(x)
,那么
observatable
将被“消耗”,而
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) )
当每个
可观察的
都完成时,我需要独立处理所有发出的值,然后,当所有
可观察的
都完成时,做一些其他事情。看起来像是:

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方法的适当解决方案


为了保持代码的合成性和可读性,有没有一种方法可以做到这一点,而不需要添加新的“人工”承诺或复杂的变通

我想你要找的是
点击
操作符,而不是
订阅

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) )

每个subscribe块中的下一个func应在以下情况下激发:

  • 1发出
  • 2发射
  • 3发射
  • 一切都完成了
像这样:

Observable1 = getStuff(a); // API wich returns an observable
Observable2 = getStuff(b); // API wich returns an observable
Observable3 = getstuff(c); // API wich returns an observable
ObservableAll = Observable.forkJoin([Observable1, Observable2, Observable3])

Observable1.subscribe((xa) => { console.log('1', xa) })
Observable2.subscribe((xb) => { console.log('2', xb) })
Observable3.subscribe((xc) => { console.log('3', xc) })
ObservableAll.subscribe((xa, xb, xc) => { console.log('all', xa, xb, xc) })

这个stackblitz显示了我认为你正在努力实现的目标

我认为他想要的是从可观察对象中获得输出,这样他就可以对其结果做些什么,但稍后订阅所有这些的
forkJoin
。添加了一个简单有效的stackblitz。stackblitz非常有用,这是处理答案的最佳方式。下次我有一个有角度的问题或答案时,我会使用它。你是对的,但你需要将调用返回的观察值传递给
pipe
,而不是再次调用
getStuff
。这同样有效(当@SiddAjmera说
getStuff().pipe(…)
在forkJoin中传递时)。在这种特定情况下,
管道(tap())
不是必需的,但在其他情况下可能有用