Angular2等待多个承诺完成

Bas*_*ijk 38 javascript promise ionic2 angular

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

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

码:

removeAll() {

  this.storage.remove(key1);
  this.storage.remove(key2);
  this.storage.remove(key3);

}
Run Code Online (Sandbox Code Playgroud)

嵌套所有是一个坏习惯,所以我正在寻找一个体面的解决方案:)

removeAll() {

  return this.storage.remove(key1).then(() => {

    this.storage.remove(key2).then(() => {

      this.storage.remove(key3);

    });

  });

};
Run Code Online (Sandbox Code Playgroud)

Gün*_*uer 61

您可以使用

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

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

  • 我想补充一点,如果这些承诺中的任何一个拒绝,'Promise.all`将立即拒绝(其余是否完成)并且将跳过`then`.如果你需要运行`doSomething()`无论它们是成功还是失败,你需要单独`catch`来返回一个`Promise.resolve()`. (5认同)

Pan*_*kar 32

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

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


小智 5

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

import {forkJoin} from 'rxjs';
Run Code Online (Sandbox Code Playgroud)

并执行Observable.forkJoin以下操作:

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