Как во время forkJoin я могу отправлять действие для каждого запроса, а также когда они все выполняются? - PullRequest
0 голосов
/ 08 июня 2018

Я использую ngrx в проекте Angular.В этом примере у меня есть массив запросов.Я хочу отправлять действие после каждого запроса, но также и после того, как все выполнено.

Пока у меня есть что-то похожее на это:

Observable.forkJoin(requests).pipe(
  map(() => new actions.requestsSuccessful()),
  catchError(() => of(new actions.requestsFailed()))
);

, где requests - это массив Observables.

Приведенный выше код работает нормально, когда все запросы выполнены, мое действие requestsSuccessful() правильно отправлено.

Однако я реализую индикатор выполнения, который я хочу обновить после каждый запрос был сделан, но я также хочу сохранить отправку действия, когда было сделано все запросов.

Я не могу понять, как отправитьдействие после каждого запроса при сохранении действия, когда все сделано.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

forkJoin испускается только после завершения всех наблюдаемых, поэтому здесь это бесполезно.Вместо этого вы можете использовать concatAll и concat.

Это пример модели, имитирующий то, что вы хотите, если я вас правильно понимаю.

const makeRequest = (v) => of(v)
  .pipe(
    delay(1000), // Simulate delay
    map(response => ({ action: 'WHATEVER', response })), // Map response into action
  );

const requests = [makeRequest(1), makeRequest(2), makeRequest(3)];

from(requests)
  .pipe(
    concatAll(), // Execute Observables in order one at the time
    concat(of({ action: 'ALL_DONE' })), // Append this when all source Observables complete
  )
  .subscribe(console.log);

См. Демонстрацию в режиме реального времени (открытая консоль):https://stackblitz.com/edit/rxjs6-demo-zyhuag?file=index.ts

Эта демонстрация выведет следующий вывод:

{action: "WHATEVER", response: 1}
{action: "WHATEVER", response: 2}
{action: "WHATEVER", response: 3}
{action: "ALL_DONE"}

Кстати, в будущих версиях RxJS будет использоваться оператор endWith, который можно использовать вместо concat, который делаетэто более читабельно.https://github.com/ReactiveX/rxjs/pull/3679

0 голосов
/ 08 июня 2018

Не проверял это.Может быть, это работает.

let progress=0
Observable.forkJoin(requests.map(e=>e.do(()=>progress++)).pipe(
  map(() => new actions.requestsSuccessful()),
  catchError(() => of(new actions.requestsFailed()))
);
...