如何知道使用多个诺言时所有诺言何时得到解决

时间:2018-09-03 15:26:23

标签: angular

我正在用node.js制作一个有角度的应用程序。我要等待所有诺言解决,然后再做一些工作。我的代码如下:

myComponent.ts

this.myService.loadData(param).then((response) => {
  console.log("loaded");
  // raise a flag here. all promises are resolved.
});

myService.ts

public loadData(param): Promise <any>{
  return new Promise((resolve, reject) => {
    this.loadMoreData(param).then((data) => {
    resolve("data loaded");
  });
});
}

public loadMoreData(param): Promise <any>{
  return new Promise((resolve, reject) => {
    this.loadSomeMoreData(param).then(() => {
    resolve("more data loaded");
  });
});
}

public loadSomeMoreData(param): Promise <any>{
  this.loadSomeMoreData(param).then(() => {
    this.loadSomeMoreMoreData(param).then(() => {
    resolve("more data loaded");
 });
});
}

...
And So on like this.

我的代码看起来像上面的链接。实际上,我已经在单独的功能中分离了每个任务,并且我必须知道每个任务何时完成。总体而言,它应该在myComponent.ts中告诉我所有承诺都已兑现。 我也尝试过

Promise.all([promise1, promise2, promise3]).then(function(values) {
 console.log(values);
});

但是正如您所看到的,我所有的诺言都在单独的服务中,并在前一个诺言返回的输出中被调用。因此我无法在myComponent.ts中解决所有问题。 任何帮助将不胜感激。谢谢

3 个答案:

答案 0 :(得分:1)

您可以从服务中退还诺言,例如

public loadData(param): Promise <any> {
   return this.loadMoreData(param);
}

public loadMoreData(param): Promise <any>{
   return this.loadSomeMoreData(param);
}

public loadSomeMoreData(param): Promise <any>{
   return this.loadSomeMoreData(param);
}

在此通话中,您只需添加catchreject

this.myService.loadData(param).then((response) => {
  console.log("loaded");
  // raise a flag here. all promises are resolved.
}).catch(...);

如果流程没有进入catch,则意味着您的诺言已得到解决,一切都很好。

答案 1 :(得分:0)

您已经将每个下一个异步调用包装到new Promise中,并且在内部请求结束后将其包装到resolve中,因此您的诺言链实际上已经准备好,您只需要调用loadData方法,并且仅在获得then响应后才会触发此方法填充中的loadSomeMoreMoreData块,因此看起来此行为正是您想要的。

PS:您还忘记了以Promise方法返回loadSomeMoreData的情况。

答案 2 :(得分:0)

另一个似乎更符合您期望的解决方案如下:

//this is in a Service1
public loadData1(param): Promise <any>{
    return asyncMethod1(param); //this return a promise
}

//this is in a Service2
public loadData2(data1): Promise <any>{
    return asyncMethod2(data1); //this return a promise
}

//this is in a Service3
public loadData3(data2): Promise <any>{
    return asyncMethod3(data2); //this return a promise
}

etc...

在您的组件中:

let data1$=Observable.fromPromise(Service1.loadData1(xxx));
let data2$=data1$.flatMap(Service2.loadData2),
let data3$=data2$.flatMap(Service3.loadData3),
data3$.subscribe(result=>/*use the final result*/);