【问题标题】:Proceeding conditionally to the next mergeMap? [ rxjs.Observable]有条件地进入下一个mergeMap? [rxjs.Observable]
【发布时间】:2021-12-23 01:32:56
【问题描述】:

我想使用 pipe,map,mergeMap, 转换我的嵌套 Observables,但是在某些条件之后我希望它继续

observableFunction 是一个遍历数组的 Observable,一旦完成,您就可以继续使用操作后的数据

observableFunction(par1,par2)
.subscribe((resp) => {
  i++;
 //do stuff, manipulate resp   
  const lastIteration = someArray.length == i;

  if (lastIteration) {
   //do stuff
   observableFunction(par1a, par2a)
      .subscribe((resp) => {
        observableHandleFunction(resp)
          .subscribe((handledData) => {
            h++;
            const lastIterationSub = someNestedArray.length == h;

            //do stuff, manipulate handledData

            if (lastIterationSub) {
              console.log("done");

          });
      });
  }
});

如何通过使用在这种情况下使用的 rxjs 功能进行转换,使其看起来更易于阅读? 比如对mergeMap应用条件?

observableFunction(par1,par2)
 .pipe(
    mergeMap((res1) => {
       //do stuff
       CONDITION={
         return observableFunction(par1a,par2a)
       }
    }),
    mergeMap((res2) => return observableHandleFunction(res2))
 )
 .subscribe((res3) => {
        h++;
        //do stuff
        const lastIterationSub = someNestedArray.length == h;

        if (lastIterationSub) {
          console.log("done");

        }
});

使用类似这样的解决方案,它不适用于条件,导致错误

【问题讨论】:

  • 从您的代码中可以看出,您在接下来的操作中根本没有在代码中使用 observableFunction 的结果?您只是使用 par1、par2 调用该函数,然后在下次调用 observableFunction 时不使用它,因为您使用的是 par1a 和 par2a,对吧?
  • 它是原始的伪代码,只是为了关注逻辑而不是细节我确实使用每个可观察的结果,这就是 // do stuff 评论所指的

标签: javascript typescript rxjs observable


【解决方案1】:

首先,嵌套subscribe 块总是一个坏主意。

如果您的 observableFunction 发出单个值(而不是一次发出整个数组)并且在完成后发出一个完整的值,您可以使用 toArray 运算符。所以:

observableFunction(par1,par2)
.pipe(toArray())
// Here you will have an array of items, now you can proceed with something like:

observableFunction(par1,par2)
  .pipe(
    toArray(),
    mergeMap(array => {
    // If neccesary you can do the same here etc
    }))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 2022-12-07
    • 2015-08-30
    • 1970-01-01
    • 2020-03-30
    • 2011-12-13
    相关资源
    最近更新 更多