我正在使用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
解决所有问题。任何帮助将受到高度赞赏。谢谢
您可以从您的服务返回承诺,例如
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);
}
在这个电话中你可以添加catch
或reject
块
this.myService.loadData(param).then((response) => {
console.log("loaded");
// raise a flag here. all promises are resolved.
}).catch(...);
如果流量没有进入catch
意味着你的承诺得到了解决,一切都很好。
在内部请求结束后,你已经将每个下一个异步调用包装到new Promise
和resolve
中,所以你的承诺链实际上就绪了,你只需要调用loadData
方法,并且只有在then
响应之后填充此方法中的loadSomeMoreMoreData
块才会被触发得到了,所以看起来这种行为是你正在寻找的。
PS:你也忘了用Promise
方法返回loadSomeMoreData
。
另一个似乎更符合您期望的解决方案如下:
//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*/);