在几个可观测量中的一个发出一个值的时候发出一个值,即使并非所有值都可以发出值?

时间:2018-05-30 22:28:54

标签: rxjs

我有两个可观察对象 - 让我们称它们为A和B.我需要按以下顺序执行以下操作:

  1. 获取A
  2. 的最新值
  3. 通过使用A的值向我的商店调度操作来获取B的最新值(调度操作会启动异步操作,最终导致B发出值)
  4. 使用A和B中的最新值来做出决定
  5. 按此方式调度操作(假设aA发出的最后一个值,dispatch返回void

    this.store.dispatch(
      new fromStore.LoadItem(a)
    );
    

    由于B取决于A的值,因此我不能使用combineLatest,因为它要求所有可观察者都发出至少一个值。我也不想使用merge,因为这需要确定值来自哪个可观察对象,而这些不是基元。似乎一个自然的解决方案是combineLatest的版本,并不要求所有提供的观察者都发出一些东西,但我不确定它是否存在,或者这里是否是正确的解决方案。

    我通过单独订阅A和B并在全球范围内存储这些值来让它以一种黑客的方式工作,但它很混乱,我想看看是否有' sa整洁的方法是在一个代码块中完成它。

    编辑:尝试Fabricio的回答:

    A.mergeMap(a => { 
      this.store.dispatch(
        new fromStore.LoadItem(a)
      );
      return a
     }, (a, b) => {
       ...
     })
    

    我不明白我应该在第一个参数(a => ???)中返回什么。 B是另一个可观察的,我不能传递A的值,因此a => B(a)不起作用。发送动作后我会返回a吗?可观察a?第二个可观察的B?在所有这些情况下,我只得到Argument of type '(a: any, b: any) => void' is not assignable to parameter of type 'number'.

1 个答案:

答案 0 :(得分:1)

我最终让它像这样工作:

A.mergeMap(a => {
  // dispatch action that causes B to eventually emit a value here
  return B.map(b => {
    // access both results here
  });
});

不确定Fabricio的答案是否是这个或类似的东西的简写,但我不能编译他的版本所以这就是我要去的。