簡體   English   中英

打字稿答應循環后返回

[英]typescript promise return after loop

在嘗試完成對外部服務的所有調用后,我試圖返回,但是我的代碼只是通過for循環飛行並返回。 我不能做一個promise.all,因為我需要在循環中獲得一些值。 在typescript / angular2中有一種簡單的方法嗎?

var ret = [];
for (var l in users){
   var userLicense = users[l].licenseNumber;
   this.callExternalService(userLicense).subscribe(response=>{
      ret.push(response+userLicense);
   }
}
resolve(ret);

由於您已經在使用可觀察對象,因此可以結合使用forkJoinmap來實現:

var ret = [];
Observable.forkJoin(
    users.map(
        user => this.callExternalService(user.licenseNumber)
            .map(response => response + user.licenseNumber)
    )
).subscribe(values => {
    ret = values;
    resolve(ret);
})

您可以嘗試combineLatest

return Observable.combineLatest(
  ...users.map(user => this.callExternalService(user.licenseNumber)
    .map(response => response + user.licenseNumber)),
  (...vals) => vals);

這將從服務調用中返回可觀察到的結果數組,然后您可以訂閱這些結果,然后根據需要將其轉換為toPromise的promise等。

如果您需要在循環中進行一些匯總並將其作為返回的一部分傳遞,則可以將其作為Promise.resolve(aggregatedData)添加到Promise.all中。

像這樣:

 function getData(ii) {
    return new Promise(res => {
      res(ii); 
     });
   }

 function getUserData(users) {
   let promiseArray = [];
   let aggregatedData = 0;

    users.forEach(user => {
      aggregatedData += user.id;
      promiseArray.push(getData(user.id));
    });
    promiseArray.push(Promise.resolve(aggregatedData));
    return Promise.all(promiseArray);
 }

 getUserData([{id:1}, {id:2}, {id:3}]).then(x=>console.log(x))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM