我正在用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
中解决所有问题。
任何帮助将不胜感激。谢谢
答案 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);
}
在此通话中,您只需添加catch
或reject
块
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*/);