Javascript typescript承诺在循环后返回
我试图在所有对外部服务的调用完成后返回,但我的代码只是在for循环中飞行并返回。我不能做承诺,因为我需要在循环中获得一些值。在typescript/angular2中有没有一种简单的方法可以做到这一点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=>{
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。我会调查这件事的