打字员承诺在循环后返回

时间:2017-05-21 21:09:44

标签: javascript node.js angular typescript promise

我尝试在完成对外部服务的所有调用后返回,但我的代码只是通过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);

3 个答案:

答案 0 :(得分:1)

由于您已经在使用observable,因此可以使用forkJoinmap的组合来实现此目的:

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

答案 1 :(得分:1)

您可以尝试combineLatest

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

这将从服务调用返回一个可观察的结果数组,然后您可以订阅,如果您愿意,可以转换为toPromise的承诺等。

答案 2 :(得分:0)

如果你需要在循环中做一些聚合并将其作为返回的一部分传递,你可以将它作为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))