web-dev-qa-db-fra.com

Angular2 attend plusieurs promesses pour finir

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

    });

  });

};
37
Bas van Dijk

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

61
Günter Zöchbauer

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.

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

version 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

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

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

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

2
Sandro Almeida

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.

2
JB Nizet