Подождите двух действий внутри компонента ngrx store - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть 2 действия с именем METADATA_SUCCESS_ACTION_1 и SUCCESS_ACTION_2.Как я могу дождаться завершения этих двух действий, а затем подписаться на консолидированные данные.

this.actions
  .pipe(
    ofType(METADATA_SUCCESS_ACTION_1),
    take(1)
  )
  .subscribe((data1: any) => {
    console.log(data1)
  });

this.actions
  .pipe(
    ofType(SUCCESS_ACTION_2),
    take(1)
  )
  .subscribe((data2: any) => {
    console.log(data2)
  });

Я хочу дождаться как успеха, так и работы как с метаданными, так и с данными об успехе.

1 Ответ

0 голосов
/ 19 ноября 2018

Звучит так, как будто вы можете использовать оператор forkJoin здесь ( Когда все наблюдаемые завершены, выведите последнее испущенное значение из каждого. ).Из документации:

Зачем использовать forkJoin?

Этот оператор лучше всего использовать, когда у вас есть группа наблюдаемых и вы заботитесь только о конечном полученном значениикаждый.Один из распространенных вариантов использования этого - это если вы хотите отправить несколько запросов при загрузке страницы (или каком-либо другом событии) и хотите действовать только тогда, когда ответ получен для всех.Таким образом, это похоже на то, как вы могли бы использовать Promise.all.

. Имейте в виду, что если какая-либо из внутренних наблюдаемых, предоставленная для forkJoin, ошибочна, вы потеряете значение любых других наблюдаемых, которые бы или уже имелизавершено, если вы не catch правильно ошиблись на внутренней наблюдаемой.Если вас интересует только то, как все внутренние наблюдаемые завершаются успешно, вы можете заметить ошибку снаружи.

Стоит также отметить, что если у вас есть наблюдаемое, которое испускает более одного элемента, и вы обеспокоены предыдущимВыбросы forkJoin не правильный выбор.В этих случаях вам лучше воспользоваться оператором, например combineLatest или zip.

. Чтобы использовать его, вы можете использовать следующий код для приведенного выше примера.

forkJoin(
  this.actions.pipe(ofType(METADATA_SUCCESS_ACTION_1), take(1)),
  this.actions.pipe(ofType(SUCCESS_ACTION_2), take(1))
).subscribe(([data1, data2]) => {
  console.log(data1);
  console.log(data2);
})
...