【问题标题】:RxJS mix combineLatest and zipRxJS 混合 combineLatest 和 zip
【发布时间】:2018-02-01 07:24:20
【问题描述】:

我有两个想要收听的流源。要求是:

  1. 如果一个发出,也给我第二个的最后一个值。
  2. 如果其中两个同时发出,请不要调用 subscribe 两次。

第一种情况是 combineLatest,但第二种情况是 zip。我需要一种将 combineLatest 和 zip 混合到一个运算符中的方法。

const { Observable, BehaviorSubject} = Rx;

const movies = {
  ids: [],
  entities: {}
}

const actors = {
  ids: [],
  entities: {}
} 

const storeOne = new BehaviorSubject(movies);
const storeTwo = new BehaviorSubject(actors);

const movies$ = storeOne.map(state => state.entities).distinctUntilChanged();
const actors$ = storeTwo.map(state => state.entities).distinctUntilChanged();

const both$ = Observable.zip(
   movies$,
   actors$,
   (movies, actors) => {
     return {movies, actors};
   }
)

both$.subscribe(console.log);

storeOne.next({
  ...storeOne.getValue(),
  entities: {
    1: {id: 1}
  },
  ids: [1]
});

storeTwo.next({
  ...storeTwo.getValue(),
  entities: {
    1: {id: 1}
  },
  ids: [1]
});

上面的代码在一个接一个地发射时工作正常,但我还需要支持其中一个发射的情况。 (结合最新)

我该怎么做?

【问题讨论】:

  • Observable.combineLatest(movies$, actors$, (movies, actors) => ({ movies, actors })).auditTime(0)
  • 你能解释一下吗?
  • 目前真的没有时间写一个像样的答案。如果没有其他人这样做,我可能会在以后这样做。或者您可以查看docs。
  • 我喜欢你的回答,你很有帮助,我会等待,谢谢!

标签: javascript rxjs


【解决方案1】:

是的,根据@cartant 的建议,您可以使用Observable.combineLatest(movies$, actors$, (movies, actors) => ({ movies, actors })).auditTime(0)

详细说明以上内容,

  1. auditTime(n) 将等待 n 毫秒并发出最新值。
  2. auditTime(0) 类似于setTimeout(0),它实际上什么都不等待(立即执行),而是等待当前事件/执行循环完成。

这里的值 B 和 2 一起发出,所以当你使用 combineLatest 时,你会得到 B1,B2 或 A2, B2(基于内部时钟)。不管B2 是该执行循环中的最新值。由于我们正在等待0 milliseconds,即当前执行循环通过auditTime(0) 获取最新值,所以observable 只会发出B2。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 2021-02-21
    • 2019-01-08
    • 2019-05-31
    • 2021-01-23
    相关资源
    最近更新 更多