2016-06-15 9 views
25

Używam SQLStorage z platformy jonowej. Funkcja usuwania zwraca obietnicę. W moim kodzie muszę usunąć wiele wartości. Kiedy wszystko się skończy, muszę wykonać jakiś kod.Angular2 czekać na wiele obietnic, aby zakończyć

Jak mogę poczekać na wszystkie z nich, a następnie uruchomić funkcję zwrotną?

Kod:

removeAll() { 

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

} 

zagnieżdżanie wszystko jest złą praktyką więc szukam godnej rozwiązanie :)

removeAll() { 

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

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

     this.storage.remove(key3); 

    }); 

    }); 

}; 

Odpowiedz

39

Można użyć

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

Patrz także https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

+5

Chciałbym dodać, że jeśli któraś z tych obietnic odrzuci, "Promise.all" natychmiast odrzuci (czy reszta się skończyła), a 'then' zostanie pominięte. Jeśli musisz uruchomić 'doSomething()' czy im się to uda, albo im się nie uda, musisz 'catch' każdego z nich indywidualnie, aby zwrócić' Promise.resolve() '. –

+0

Z 'Promise.all()', będą one wykonywane jeden po drugim, lub wszystkie na raz? – Robouste

+0

Wszystkie wywołania są wykonywane natychmiast, a następnie 'Promise.all()' czeka, aż wszystkie te obietnice się zakończą, zanim się skończą.To nie jest funkcja "Promise.all". Z tym kodem 'Promise.all ([ this.storage.remove (key1),', ...]); '' this.storage.remove (key1) 'jest wywoływane i tylko zwracana wartość (' Promise') jest dodawany do tablicy, która jest przekazywana do 'Promise.all (...)' –

19

można użyć Observable.forkJoin z rxjs dostarczając tablicę wszystkich observables/promises. Należy to zrobić przed wykonaniem operacji. Jest podobny do 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]; 
}); 
+0

Observable.forkJoin pracuje dla mnie. Rx.Observable.forkJoin nie. – Ant

+1

Dzięki temu zaktualizowałem odpowiedź: –

1

Zastosowanie Promise.all():

Promise.all metoda (iterable) zwraca obietnicę, że gdy rozwiązuje wszystkich obietnic w iterowalny argumentu zostały rozwiązane, albo odrzuca z powodu pierwszego minął obietnica, która odrzuca.

Składnia

Promise.all(iterable); 

Parametry

iterowalny

iterowalny przedmiotu, na przykład w postaci tablicy. Zobacz iterowalne.

3

nie jestem zaznajomiony z jonowych, ale przy założeniu, że storage.remove wraca obietnicę Proponuję korzystać z operatorem forkJoin obserwowalne.

ForJoin ma szereg obserwowalnych i oczekuje na wykonanie wszystkich przedmiotów.

Po prostu zauważ, że musiałem stworzyć 3 nowe obserwowalne z każdej obietnicy zwrotu metodą .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]); 
 
});

Powiązane problemy