J'utilise SQLStorage à partir de la plate-forme Ionic. La fonction de suppression renvoie une promesse. Dans mon code, je dois supprimer plusieurs valeurs. Lorsque toutes ces opérations sont terminées, je dois exécuter du code.
Comment puis-je attendre pour tous ces éléments, puis exécuter une fonction de rappel?
Code:
removeAll() {
this.storage.remove(key1);
this.storage.remove(key2);
this.storage.remove(key3);
}
Tout imbriquer est une mauvaise pratique alors je cherche une solution décente :)
removeAll() {
return this.storage.remove(key1).then(() => {
this.storage.remove(key2).then(() => {
this.storage.remove(key3);
});
});
};
Vous pouvez utiliser
removeAll() {
Promise.all([
this.storage.remove(key1),
this.storage.remove(key2),
this.storage.remove(key3),
]).then(value => doSomething());
Voir aussi https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all
Vous pouvez utiliser Observable.forkJoin
de rxjs
en fournissant un tableau de tous les observables/promises
. Cela doit être fait avant d'effectuer l'opération. C'est similaire à Angular 1's $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];
});
Sur rxjs
version> 6 Vous pouvez faire quelque chose comme ceci:
import {forkJoin} from 'rxjs';
et faire au lieu de Observable.forkJoin
cette:
forkJoin([
this.service1.get(),
this.service2.get()
]).subscribe(data => {
this.data1= data[0];
this.data2 = data[1];
Je ne suis pas familier avec IONIC, mais en supposant que storage.remove renvoie une promesse, je vous suggérerais d'utiliser forkJoin à partir de observables.
forkJoin prend un tableau d'observables et attend l'exécution de tous les éléments.
Notez simplement que je devais créer 3 nouveaux observables à partir de chaque promesse renvoyée par la méthode .remove.
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]);
});
utiliser Promise.all pour Promisses et Observable.forkJoin pour Observables
comme la question concerne les angles (2+) et que vous auriez probablement dû utiliser Observable au lieu de promesses. Je vais ajouter un exemple GET qui a fonctionné pour moi:
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));
notez l'utilisation d'un .map () pour gérer la réponse plutôt que de .subscribe ()
Utilisez Promise.all () :
La méthode Promise.all (iterable) renvoie une promesse qui est résolue lorsque toutes les promesses de l'argument itérable ont été résolues ou sont rejetées avec le motif de la première promesse passée qui a été rejetée.
Syntaxe
Promise.all(iterable);
Paramètres
itérable
Un objet itérable, tel qu'un tableau. Voir iterable.