web-dev-qa-db-ja.com

Angular2は複数の約束が完了するのを待ちます

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

    });

  });

};
37
Bas van Dijk

使用できます

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 も参照してください

61

すべての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];
});
30
Pankaj Parkar

rxjs version> 6では、次のようなことができます。

import {forkJoin} from 'rxjs';

Observable.forkJoinの代わりにこれを行います:

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

私はIONICに精通していませんが、storage.removeが約束を返していると仮定すると、observableからforkJoin演算子を使用することをお勧めします。

forkJoinはオブザーバブルの配列を受け取り、すべてのアイテムの実行を待ちます。

.removeメソッドによって返された各promiseから3つの新しいオブザーバブルを作成する必要があることに注意してください。

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]);
});
3
Daniel Pliscki

promisesにはPromise.allを使用し、ObservablesにはObservable.forkJoinを使用します

質問はangular(2+)に関するものであり、おそらくpromiseの代わりにObservableを使用していたはずです。私に役立つ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)); 

.subscribe()ではなく、1つの.map()を使用して応答を処理することに注意してください。

2
Sandro Almeida

Promise.all() を使用します。

Promise.all(iterable)メソッドは、反復可能な引数内のすべてのプロミスが解決されたときに解決するプロミスを返すか、拒否された最初に渡されたプロミスの理由で拒否します。

構文

Promise.all(iterable);

パラメーター

反復可能

配列などの反復可能なオブジェクト。反復可能を参照してください。

2
JB Nizet