如何知道何时使用多个承诺解决所有承诺

问题描述 投票:1回答:3

我正在使用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解决所有问题。任何帮助将受到高度赞赏。谢谢

angular
3个回答
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意味着你的承诺得到了解决,一切都很好。


0
投票

在内部请求结束后,你已经将每个下一个异步调用包装到new Promiseresolve中,所以你的承诺链实际上就绪了,你只需要调用loadData方法,并且只有在then响应之后填充此方法中的loadSomeMoreMoreData块才会被触发得到了,所以看起来这种行为是你正在寻找的。

PS:你也忘了用Promise方法返回loadSomeMoreData


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*/);
© www.soinside.com 2019 - 2024. All rights reserved.