Angular2 дождитесь завершения нескольких promises
Я использую SQLStorage с платформы Ionic. Функция удаления возвращает обещание. В моем коде мне нужно удалить несколько значений. Когда все закончится, мне нужно выполнить какой-то код.
Как я могу подождать все это, а затем выполнить функцию обратного вызова?
Код:
removeAll() {
this.storage.remove(key1);
this.storage.remove(key2);
this.storage.remove(key3);
}
Вложение всех - это плохая практика, поэтому я ищу достойное решение:)
removeAll() {
return this.storage.remove(key1).then(() => {
this.storage.remove(key2).then(() => {
this.storage.remove(key3);
});
});
};
Ответы
Ответ 1
Вы можете использовать
removeAll() {
Promise.all([
this.storage.remove(key1),
this.storage.remove(key2),
this.storage.remove(key3),
]).then(value => doSomething());
См. также https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all
Ответ 2
Вы можете использовать Observable.forkJoin
из rxjs
, предоставив массив из всех observables/promises
. Это необходимо выполнить перед выполнением операции. Он похож на 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];
});
Ответ 3
Я не знаком с IONIC, но, полагая, что storage.remove возвращает обещание, я предлагаю вам использовать forkJoin оператор из наблюдаемых.
ForJoin принимает массив наблюдаемых и ожидает выполнения всех элементов.
Просто заметьте, что мне пришлось создать 3 новых наблюдаемых из каждого обещания, возвращаемого методом .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]);
});
Ответ 4
Используйте Promise.all():
Метод Promise.all(итерируемый) возвращает обещание, которое разрешает, когда все promises в итерабельном аргументе разрешились или отклоняются по причине первого переданного обещания, которое отклоняет.
Синтаксис
Promise.all(iterable);
Параметры
итерация
Итерируемый объект, например массив. См. Iterable.