【问题标题】:How to wait for chain of subscriptions finishes?如何等待订阅链完成?
【发布时间】:2017-02-08 16:41:46
【问题描述】:

我仍在为 Observables 苦苦挣扎,因为我正在编写具有复杂逻辑和多个请求和响应的复杂 REST API 查询函数。

我已经写了很多这样的订阅函数,

function1(){
   thisReturnsAnObservable()
    .subscribe();
}

function2(){
   thisReturnsAnObservable()
    .subscribe();
}

function3(){
   thisReturnsAnObservable()
    .subscribe();
}

在有多个查询的函数中,我这样编码

complexFunction(){
  function1();
  function2();
  function3();
  if (aVariableChangedBy123 == true){
    doSomething();
  }
}

我想我很困惑,实验证明我错了,因为变量 aVariableChangedBy123 总是在 function1,2,3 完成之前被评估,所以我想要的是因为 aVariableChangedBy123 只有在 function1,2 之后才会确定, 3 依次完成,我应该如何编写一个函数来将这些函数与订阅链接,使它们顺序运行?

我知道可以重写所有函数1、2、3,但有没有办法不需要编写这些函数,因为我可以在其他情况下重用它们?

我尝试使用 flatMap() 函数,我知道它可以像 then() 一样链接它们,但是代码在运行时总是会出错,比如 Cannot read property 'flatMap' of undefined,因为所有函数 1、2、3 都是 void 函数.

我有办法,但不知道对不对。

喜欢

Observable.forkJoin(Observable.of(function1),Observable.of(function2)).subscribe() ;

这可行吗?从没想过我可以静态使用它...

【问题讨论】:

  • 检查flatMap(现在mergeMap 带有rxjs5)和forkJoin
  • 他们似乎不适合我,有时他们只是给我 void[] is not assignable to type of SubscribableOrPromise 错误

标签: javascript angular asynchronous rxjs observable


【解决方案1】:

您应该使用mapswitchMap 运算符,并且每个函数都应该返回一个订阅,以便它可以转到下一个函数。这样,您将仅在最后一个方法中订阅,并且您的函数将按顺序运行。

【讨论】:

  • 有没有一种方法我不需要更改那些 void 函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
  • 1970-01-01
  • 2019-09-23
  • 2019-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多