Подтвердить что ты не робот

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

    });

  });

};
4b9b3361

Ответ 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.