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);
});
});
};
使用できます
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 も参照してください
すべてのObservable.forkJoin
の配列を提供することにより、rxjs
から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];
});
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
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];
私は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]);
});
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()を使用して応答を処理することに注意してください。
Promise.all() を使用します。
Promise.all(iterable)メソッドは、反復可能な引数内のすべてのプロミスが解決されたときに解決するプロミスを返すか、拒否された最初に渡されたプロミスの理由で拒否します。
構文
Promise.all(iterable);
パラメーター
反復可能
配列などの反復可能なオブジェクト。反復可能を参照してください。