2016-06-15 25 views
25

Sto utilizzando SQLStorage dalla piattaforma Ionic. La funzione di rimozione restituisce una promessa. Nel mio codice ho bisogno di rimuovere più valori. Quando questi sono tutti finiti ho bisogno di eseguire del codice.Angular2 attendi che siano chiuse più promesse

Come posso attendere tutti questi e quindi eseguire una funzione di richiamata?

Codice:

removeAll() { 

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

} 

Nesting tutto è una cattiva pratica, quindi sono alla ricerca di una soluzione decente :)

removeAll() { 

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

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

     this.storage.remove(key3); 

    }); 

    }); 

}; 

risposta

39

È possibile utilizzare

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

Vedi anche https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

+5

Aggiungo che se una qualsiasi di queste promesse viene respinta, 'Promise.all' rifiuterà immediatamente (se il resto è terminato) e il' then' verrà saltato. Se hai bisogno di eseguire 'doSomething()' se riescono o falliscono, devi "catturare" ognuno di allora individualmente per restituire un 'Promise.resolve()'. –

+0

Con 'Promise.all()', verranno scomunicati uno dopo l'altro o tutti insieme? – Robouste

+0

Tutte le chiamate vengono eseguite immediatamente, quindi 'Promise.all()' aspetta che tutte queste promesse vengano completate prima che si completi.Questa non è una funzione di 'Promise.all'. Con questo codice 'Promise.all ([ this.storage.remove (key1),', ...]); '' this thisstage.remove (key1) 'viene chiamato e solo il valore restituito (a' Promise') viene aggiunto all'array passato a 'Promise.all (...)' –

19

Si potrebbe usare Observable.forkJoin da rxjs fornendo un array di tutti il observables/promises. Questo deve essere fatto prima di eseguire l'operazione. È simile a quello di 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

Observable.forkJoin funziona per me. Rx.Observable.forkJoin no. – Ant

+1

Grazie aggiornato la risposta –

1

Uso Promise.all():

Il Promise.all metodo (iterable) restituisce una promessa che si risolve quando tutte le promesse nell'argomento iterabile hanno risolto, o respinge con la ragione della prima passata prometti che respinge.

Sintassi

Promise.all(iterable); 

Parametri

iterable

Un oggetto iterabile, ad esempio una matrice. Vedi iterabile.

3

io non sono a conoscenza IONICO, ma partendo dal presupposto che storage.remove restituisce un promessa vorrei suggerire di utilizzare operatore forkJoin da osservabili.

ForJoin accetta una serie di osservabili e attende l'esecuzione di tutti gli elementi.

Basta notare che ho dovuto creare 3 nuovi osservabili da ogni promessa restituita dal metodo .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]); 
 
});

Problemi correlati