【问题标题】:RxJS Promises ChainingRxJS 承诺链式
【发布时间】:2016-02-09 11:48:49
【问题描述】:

我对 RxJS 还是很陌生。所以我有一个为不同的 ajax 调用创建有效负载的流,然后我使用 flatMap 来检索我需要的数据,它工作正常。很简单。

const streamA = Rx.Observable.from(array);

const streamB = streamA
  .map( val => /* build payload */ )
  .flatMap( payload => Rx.Observable.fromPromise($.ajax(payload))

streamB.subscribe( result => /* got it */)

现在我将为每个项目创建一个有效负载数组,但问题是现在当我订阅流时,我会返回每个请求,但完成后我只会返回初始元素。

const streamC = streamA
  .flatMap( payloads => {
    return Rx.Observable.from(payloads)
      .flatMap( payload => Rx.Observable.fromPromise($.ajax(payload))

streamC.subscribe( result => /* executed for every payload */)

我尝试使用 groupBy 返回正确的分组数组并向我展示我可以链接 Observable,但我仍然无法弄清楚如何正确订阅观察者以实现元素。

const streamWLF = streamA
  .flatMap( payloads => {
    return Rx.Observable.from(payloads)
      .flatMap( payload => Rx.Observable.fromPromise($.ajax(payload))
      .groupBy((obs) => obs.key, (obs) => obs)

streamWLF.subscribe( result => {
  result.subscribe(/* did my magic here*/);
})

所以我的问题是,最好的方法是什么?

收到子流时是否总是触发订阅的主流?

如果可能的话,我如何订阅 subStream 以触发仅在 subStream 完成时订阅的 mainStream?

【问题讨论】:

  • 或许你应该使用 concatMap 而不是 flatMap。
  • 我不清楚你的问题。你是什​​么意思你“完成后只会返回初始元素”? Promise 只返回一个项目,你是否试图以某种方式将每组有效负载的结果关联在一起?
  • @paulpdaniels 是的,我有包含一组有效负载的项目,我想要返回,不是流中的所有有效负载,而是包含返回的有效负载的元素。

标签: javascript promise reactive-programming rxjs


【解决方案1】:

我认为您正在寻找 forkJoin 运算符。

const streamC = streamA
  .flatMap(payloads => Rx.Observable.forkJoin(payloads));

streamC.subscribe( results => /*An array containing the results from all payloads*/);

【讨论】:

    猜你喜欢
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 2016-05-16
    • 2017-03-13
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    相关资源
    最近更新 更多