2016-06-15 13 views
25

IonicプラットフォームのSQLStorageを使用しています。 remove関数は約束を返します。私のコードでは、複数の値を削除する必要があります。これらがすべて終了したら、私はいくつかのコードを実行する必要があります。Angular2は複数の約束が完了するのを待つ

これらをすべて待ってから、コールバック関数を実行するにはどうすればよいですか?

コード:

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

    }); 

    }); 

}; 

答えて

39

あなたは私がイオンに慣れていないんだけど、そのstorage.removeを仮定すると、私はあなたからforkJoin演算子を使用することをお勧め約束を返してもhttps://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

+5

これらの約束が拒否された場合、 'Promise.all'は直ちに拒否され(残りが終了しているかどうかにかかわらず)、' then'はスキップされます。 'doSomething()'を成功させるか失敗するかを実行する必要がある場合は、 'Promise.resolve()'を返すために個々に 'catch 'する必要があります。 –

+0

'Promise.all()'を使うと、1つずつ、またはすべてを一度に実行するのですか? – Robouste

+0

すべての呼び出しは直ちに実行され、 'Promise.all()'は完了する前にこれらの約束が完了するのを待ちます。これは 'Promise.all'機能ではありません。このコード 'Promise.all([ this.storage.remove(key1)、' ...]); '' this.storage.remove(key1) 'が呼び出され、戻り値(' Promise' )が 'Promise.all(...)'に渡される配列に追加されます。 –

19

あなたはすべての配列を提供することにより、rxjsからObservable.forkJoinを使用することができます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]; 
}); 
+0

。 Rx.Observable.forkJoinはそうではありません。 – Ant

+1

お返事ありがとうございました –

1

使用Promise.all()

Promise.all(反復可能)メソッドは、反復可能な引数での約束がすべて解決されていたときに解決する約束を返す、または渡された最初の理由で拒否拒絶を約束する。

構文

Promise.all(iterable); 

パラメータ

反復可能

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

3

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

参照を使用することができます観察可能な

ForJoinは観測可能な配列をとり、すべてのアイテムの実行を待ちます。

私は、.removeメソッドによって返される各約束から3つの新しいオブザーバブルを作成しなければならないことに気付くだけです。私の作品Observable.forkJoin

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

関連する問題