Angular2等待多个承诺完成

时间:2016-06-15 17:11:59

标签: javascript angular promise ionic2

我正在使用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 个答案:

答案 0 :(得分:59)

您可以使用

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

答案 1 :(得分:29)

您可以通过提供所有Observable.forkJoin的数组来使用rxjs中的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];
});

答案 2 :(得分:4)

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];

答案 3 :(得分:3)

我不熟悉IONIC,但假设storage.remove返回一个promise我建议你使用来自observables的forkJoin运算符。

forkJoin获取一组observable并等待所有项的执行。

请注意,我必须从.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]);
});




答案 4 :(得分:2)

使用Promise.all进行Promisses和Observable.forkJoin for Observables

因为问题是关于角度(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()

答案 5 :(得分:1)

使用Promise.all()

  

Promise.all(iterable)方法返回一个promise,它在iterable参数中的所有promise都已解析时解析,或者拒绝第一个传递的拒绝的promise的原因。

     

语法

Promise.all(iterable);
     

参数

     

迭代

     

可迭代对象,例如Array。见iterable。