如何等待订阅链完成?

时间:2017-02-08 16:41:46

标签: javascript angular asynchronous rxjs observable

我仍在努力使用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,因为所有的funtion1, 2,3是无效函数。

我有办法,但我不知道它是否正确。

喜欢

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

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

1 个答案:

答案 0 :(得分:0)

您应该使用 'submit #editTaskDetails'(event){ event.preventDefault(); var id = FlowRouter.getParam('taskId'); const singleDetailsUpdate = Tasks.findOne({_id:id}); const singleID = singleDetailsUpdate._id; const target = event.target; const facilityTarget = target.facilityName.value; const inspectorTargetName = target.detailsinspector.value; const inspectorIdTarget = target.inspectorid.value; const detailsTarget = target.detailstype.value; const dateTarget = target.TaskDate.value; console.log(singleID) Meteor.call("changeTaskDetails", singleID,detailsTarget); },map运算符,每个函数都应该返回一个订阅,以便它可以转到下一个函数。这样,您只能在最后一个方法中订阅,并且您的函数将按顺序运行。