45 votes

Angular2 attendre plusieurs promesses pour finir

Je suis l'aide de la SQLStorage à partir de la plate-forme Ionique. La suppression de la fonction retourne une promesse. Dans mon code j'ai besoin de supprimer une ou plusieurs valeurs. Lorsque ceux-ci sont tous finis-je besoin pour exécuter du code.

Comment puis-je attendre pour tous ces puis exécutez une fonction de rappel?

Code:

removeAll() {

  this.storage.remove(key1);
  this.storage.remove(key2);
  this.storage.remove(key3);

}

L'imbrication de tous est une mauvaise pratique donc, je suis à la recherche d'une solution convenable :)

removeAll() {

  return this.storage.remove(key1).then(() => {

    this.storage.remove(key2).then(() => {

      this.storage.remove(key3);

    });

  });

};

77voto

Günter Zöchbauer Points 21340

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

35voto

Pankaj Parkar Points 45409

Vous pouvez utiliser Observable.forkJoin de rxjs , en fournissant un tableau de tous les observables/promises. Ceci doit être fait avant d'effectuer l'opération. Il est similaire à l'Angulaire de 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];
});

3voto

Daniel Pliscki Points 1423

Je ne suis pas familier avec l'IONIQUE, mais en supposant que le stockage.retirer est de retour d'une promesse, je vous suggère d'utiliser forkJoin de l'opérateur à partir des observables.

ForJoin prend un tableau des observables et attend l'exécution de tous les éléments.

Il suffit de remarquer que j'avais créer 3 nouveaux observables de chaque promesse de retour par le .supprimer la méthode.

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

2voto

Sandro Almeida Points 41

l'utilisation de la Promesse.tout pour la promesse tenue et Observables.forkJoin pour des Observables

comme la question est à propos angulaire(2+) et vous avez probablement devrait avoir été en utilisant des Observables au lieu de promesses. je vais ajouter un exemple 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 de l'un .carte() pour gérer la réponse plutôt que .subscribe()

2voto

JB Nizet Points 250258

L'Utilisation De La Promesse.tous les():

De La Promesse.tous(itératif) méthode renvoie une promesse qui résout lorsque toutes les promesses de l'itérable argument est résolu, ou rejette avec la raison de la première passé promesse qui le rejette.

La syntaxe

Promise.all(iterable);

Paramètres

itérable

Un objet iterable objet, comme un Tableau. Voir itératif.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X