Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript typescript承诺在循环后返回_Javascript_Node.js_Angular_Typescript_Promise - Fatal编程技术网

Javascript typescript承诺在循环后返回

Javascript typescript承诺在循环后返回,javascript,node.js,angular,typescript,promise,Javascript,Node.js,Angular,Typescript,Promise,我试图在所有对外部服务的调用完成后返回,但我的代码只是在for循环中飞行并返回。我不能做承诺,因为我需要在循环中获得一些值。在typescript/angular2中有没有一种简单的方法可以做到这一点 var ret = []; for (var l in users){ var userLicense = users[l].licenseNumber; this.callExternalService(userLicense).subscribe(response=>{

我试图在所有对外部服务的调用完成后返回,但我的代码只是在for循环中飞行并返回。我不能做承诺,因为我需要在循环中获得一些值。在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);

如果需要在循环中进行聚合并将其作为返回的一部分传递,可以将其添加到Promise.all as Promise.resolve(aggregatedData)中

诸如此类:

 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))

如果需要在循环中进行聚合并将其作为返回的一部分传递,可以将其添加到Promise.all as Promise.resolve(aggregatedData)中

诸如此类:

 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))

由于您已经在使用Observable,您可以使用和的组合来实现这一点:

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

由于您已经在使用Observable,您可以使用和的组合来实现这一点:

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

您可以尝试
CombineTest

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

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

您可以尝试
combinelatetest

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

这将从服务调用中返回一组可观察的结果,然后您可以订阅这些结果,如果愿意,可以使用
toPromise
将其转换为promise,等等。

您需要组合
promise.all()
map()
。Does
.subscribe()
返回一个
承诺
?外部调用从http.get获取一个可观察的request@guest271314否,
订阅
返回一个
订阅
。但是,如果您希望使用
toPromise
@guest271314,您可以将可观察到的内容转换为承诺。它们是rxjs的一部分。您需要
promise.all()
map()
的组合。Does
.subscribe()
返回
承诺
?外部调用从http.get获取可观察到的内容request@guest271314不
subscribe
返回
订阅
。但是,如果您希望使用
toPromise
@guest271314,您可以将可观察到的内容转换为承诺。他们是rxjs的一部分。但他不是在使用承诺,而是在使用可观察到的内容。您也可以使用Obseravble.forkJoin。顺便说一句,他的问题主题是“typescript promise return after loop”-所以我假设他使用promise。但他没有使用promise,他使用的是Obseravble.forkJoin。顺便说一句,他的问题主题是“typescript promise-return-after-loop”-所以我假设他使用promise@torazaburo,它来自OP的代码。我不想改变它。我想这整件事都包含在另一个承诺中。@torazaburo它包含在另一个承诺中,谢谢你澄清Saravana。我会调查这件事的forkJoin@torazaburo这是OP的密码。我不想改变它。我想这整件事都包含在另一个承诺中。@torazaburo它包含在另一个承诺中,谢谢你澄清Saravana。我会调查这件事的