等待多个Promise完成

IT技术 javascript angular promise ionic2
2021-01-20 15:38:59

我正在使用 Ionic 平台的 SQLStorage。remove函数返回一个Promise。在我的代码中,我需要删除多个值。当这些都完成后,我需要执行一些代码。

如何等待所有这些然后执行回调函数?

代码:

removeAll() {    
  this.storage.remove(key1);
  this.storage.remove(key2);
  this.storage.remove(key3);    
}

全部嵌套是一种不好的做法,所以我正在寻找一个不错的解决方案:)

removeAll() {
  return this.storage.remove(key1).then(() => {
    this.storage.remove(key2).then(() => {
      this.storage.remove(key3);        
    });
  });
};
6个回答

您可以使用

removeAll() {
  Promise.all([
    this.storage.remove(key1),
    this.storage.remove(key2),
    this.storage.remove(key3),
  ]).then(value => doSomething());

另见https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

所有调用都会立即执行,然后Promise.all()在它自己完成之前等待所有这些Promise完成。这不是一个Promise.all功能。使用此代码Promise.all([ this.storage.remove(key1),,...]);`this.storage.remove(key1)被调用,并且仅将返回值 (a Promise) 添加到传递给的数组中Promise.all(...)
2021-03-23 15:38:59
我要补充的是,如果这些Promise中的任何一个被拒绝,Promise.all将立即拒绝(无论其他Promise是否完成)并且then将被跳过。如果您需要运行doSomething()它们无论它们是成功还是失败,您都需要catch分别返回一个Promise.resolve().
2021-03-24 15:38:59
随着Promise.all(),它们会一个接一个地执行,还是一次全部执行?
2021-03-30 15:38:59

你可以使用Observable.forkJoinrxjs提供的所有的数组observables/promises这需要在执行操作之前完成。它类似于 Angular 1 的$q.all.

rxjs 版本 <= 6

Observable.forkJoin([
   this.storage.remove(key1), 
   this.storage.remove(key2),
   this.storage.remove(key3)
])
.subscribe(t=> {
    var firstResult = t[0];
    var secondResult = t[1];
});

rxjs 版本 > 6

import {forkJoin} from 'rxjs';

forkJoin([
   this.storage.remove(key1), 
   this.storage.remove(key2),
   this.storage.remove(key3)
])
.subscribe(t=> {
    var firstResult = t[0];
    var secondResult = t[1];
});
Observable.forkJoin 对我有用。Rx.Observable.forkJoin 没有。
2021-03-21 15:38:59

rxjs版本 > 6 上,您可以执行以下操作:

import {forkJoin} from 'rxjs';

而不是Observable.forkJoin这样

forkJoin([
  this.service1.get(),
  this.service2.get()
]).subscribe(data => {
  this.data1= data[0];
  this.data2 = data[1];

将 Promise.all 用于 Promisses,将 Observable.forkJoin 用于 Observables

因为问题是关于 angular(2+) 并且您可能应该使用 Observable 而不是 promises。我将添加一个对我有用的 GET 示例:

import {Observable} from 'rxjs/Rx';

Observable.forkJoin(
      this._dataService.getOne().map(one => this.one =one),
      this._dataService.getTwo().map(two => this.two two),
      this._dataService.getN().map(n => this.n = n),
     )
    ).subscribe(res => this.doSomethingElse(this.one, this.two, this.n)); 

注意使用 .map() 来处理响应而不是 .subscribe()

我不熟悉 IONIC,但假设 storage.remove 正在返回一个Promise,我建议您使用 observables 中的 forkJoin 运算符。

forkJoin 接受一组 observables 并等待所有项目的执行。

请注意,我必须从 .remove 方法返回的每个Promise中创建 3 个新的 observable。

Observable.forkJoin([
   Observable.fromPromise(this.storage.remove(key1)), 
   Observable.fromPromise(this.storage.remove(key2)),
   Observable.fromPromise(this.storage.remove(key3))
])
.subscribe(data => {
    console.log(data[0]);
    console.log(data[1]);
    console.log(data[2]);
});