簡體   English   中英

等待多個承諾完成

[英]Wait for multiple promises to finish

我正在使用 Ionic 平台的 SQLStorage。 remove函數返回一個承諾。 在我的代碼中,我需要刪除多個值。 當這些都完成后,我需要執行一些代碼。

如何等待所有這些然后執行回調函數?

代碼:

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);        
    });
  });
};

你可以使用

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

您可以通過提供所有observables/promises的數組來使用rxjsObservable.forkJoin 這需要在執行操作之前完成。 它類似於 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];
});

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

我不熟悉 IONIC,但假設 storage.remove 正在返回一個承諾,我建議您使用 observables 中的 forkJoin 運算符。

forkJoin 接受一組 observables 並等待所有項目的執行。

請注意,我必須從 .remove 方法返回的每個承諾中創建 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]); });

使用Promise.all()

Promise.all(iterable) 方法返回一個承諾,該承諾在 iterable 參數中的所有承諾都已解決時解決,或者以第一個通過的承諾拒絕的原因拒絕。

語法

Promise.all(iterable);

參數

可迭代的

一個可迭代的對象,例如一個數組。 參見可迭代。

對 Promisses 使用 Promise.all,對 Observables 使用 Observable.forkJoin

因為問題是關於 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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM