![](/img/trans.png)
[英]Wait for Promise before calling another promise from inside a for loop - Angular
[英]Angular 8 - Wait for promise to finish in loop before iterating
我需要遍历一个列表并进行多次调用,这些调用依赖于先前的调用以在迭代循环之前完成。 每个 function 调用都会返回一个 promise。
我当前的代码只是遍历列表并尽可能快地进行调用:
this.records.forEach(item => {
this.myService.doFirstTask().then(res => {
if (res) {
this.myService.doSecondTask().then(res => {
if (res) {
// do something.
}
});
}
});
});
问题是,在允许 the.forEach 到 go 到下一个项目之前,我需要先等待myService.doSecondTask()
完成并返回它的 promise。
我知道解决方案是将async
function 与await
一起使用,但这对我来说很新。
在迭代 .forEach 循环之前,任何人都可以提供一些关于如何等待嵌套 promise 完成的帮助吗?
是使.doSecondTask()
function 使用async-await
的解决方案吗?
看到您在 Angular 中,您应该使用可观察对象。 如果您的服务返回可观察的而不是像 Angular 中那样的承诺,您可以使用 RxJs concatMap。
from(this.records).pipe(
concatMap(record => this.myService.doFirstTask(record)),
switchMap(resultOfDoFirstTask => this.myService.doSecondTask())
).subscribe(resultOfDoSecondTask => {
// Fires once for each record
});
这是 RxJs 方式。 我们倾向于避免使用 Angular 中的承诺,因为它是建立在 RxJs 之上的。
这是演示的可运行片段。
const { of, from } = rxjs; const { concatMap, switchMap, delay } = rxjs.operators; const records = [1,2,3,4,5,6]; const myService = { doFirstTask: val => of(`${val}: from first task`).pipe(delay(500)), doSecondTask: val => of(`${val}: from second task`).pipe(delay(500)), }; from(records).pipe( concatMap(record => myService.doFirstTask(record).pipe( switchMap(resultOfDoFirstTask => myService.doSecondTask(resultOfDoFirstTask)) )) ).subscribe(resultOfDoSecondTask => { console.log(resultOfDoSecondTask); });
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.6.0/rxjs.umd.min.js"></script>
如果您不想重构您的服务以返回可观察对象,您可以将它们包装在 from 中以从 promise.from from(this.myService.doSecondTask())
中获取可观察对象
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.