让我们说我有一个foreach循环
Object.keys(this.treeMap).forEach(id=>{
this.getSelectionById(id);
})
this.processAfterHttpCalls();
和getSelectionById方法进行http调用
getSelectionById(id){
let requestBody = {
id: id
};
this.subscription = this.dependenciesService.getInstancesByCSIId(requestBody)
.subscribe(data => {
this.someProcessing(data);
}, err => {
this.appMessageService.showMessage(this.appMessageService.ERROR, err);
})
}
但是有什么方法可以使那些调用异步,所以一旦在forEach块中调用了http调用,就可以调用另一种方法了?
答案 0 :(得分:1)
您可以将箭头函数声明为异步函数。
示例:
Object.keys(this.treeMap).forEach(async id=>{
await this.getSelectionById(id);
})
答案 1 :(得分:1)
如果您的getSelectionById返回一个可观察的值:
getSelectionById(id){
let requestBody = {
id: id
};
return this.dependenciesService.getInstancesByCSIId(requestBody)
.pipe(map(data => this.someProcessing(data));
}
您可以将所有http呼叫压缩到一个可观察的内部:
zip(...Object.keys(this.treeMap).map(id=> this.getSelectionById(id)))
.subscribe(_ => this.processAfterHttpCalls(), err => this.appMessageService.showMessage(this.appMessageService.ERROR, err));
这样,所有的HTTP调用都是并行进行的,当所有的HTTP调用完成时,将调用processAfterHttpCalls。
答案 2 :(得分:-2)
我认为您可以使用setTimeout,因为它异步运行:
Object.keys(this.treeMap).forEach(id=>{
var self = this;
setTimeout(function(){
self.getSelectionById(id);
},10);
})