В обикновения rxjs имаме много оператори и можем да извършваме едни и същи действия по различни начини.

Често извършваме повтарящи се действия като извличане на данни паралелно, един по един и т.н. и всеки път трябва да го изграждаме с много оператори. Това разширение може да опрости кода, като въведе само няколко оператора за повтарящи се действия. Благодарение на това разширение кодът е по-ясен и можем да се съсредоточим върху действието, което трябва да направим, а не кой оператор да изберем.

Това разширение може да бъде полезно, когато:

  • имате нужда от данни от всяко действие,
  • искате да извиквате действия паралелно или едно по едно и искате да изчакате резултата — awaitAll,
  • искате да дефинирате динамични действия — asyncPipeFrom
  • искате да пропуснете действие в зависимост от условието

Вижте пример в Stackblitz

Сравнение с обикновен rxjs

  • код с разширение async-await-rx
asyncPipe(
  awaitAction(() => action1()),
  awaitAll(() => [action2_1(), action2_2(), action2_3(), action2_4()]),
  awaitAction(() => action3()),
  action((value, index, [_, items]) =>
    console.log({ value, items /* data[1] */ }) // { 'action3', ['action2_1', 'action2_2', 'action2_3', 'action2_4']}
  ),
  awaitAction((value) => action4(value))
)
  .pipe(
    takeUntil(cancel$),
    finalize(() => (isLoading = false))
  )
  // Async pipe return value from last action and data from each action. It is array.
  // we can use destructurization for example: [value, [action1Val, action2Val, action3Val]]
  // first item is value from last action and the second is data from all actions
  .subscribe(([value, [val1, val2, val3]]) => {
    console.log(val1); // Display value from 1st action
    console.log(val2); // Display items from 2nd action
    console.log(val3); // Display items from 3rd action
  });
  • код без разширение (в обикновен rxjs)
action1()
  .pipe(
    switchMap((data) =>
      combineLatest([action2_1(), action2_2(), action2_3(), action2_4()]).pipe(
        map((items) => [data, items])
      )
    ),
    switchMap((data) => action3().pipe(map((value) => [...data, value]))),
    tap(([_, items, value]) => console.log({ value, items })),
    switchMap((data) =>
      action4(data[2]).pipe(map((value) => [...data, value]))
    ),
    takeUntil(cancel$),
    finalize(() => (isLoading = false))
  )
  .subscribe(([val1, val2, val3]) => {
    console.log(val1); // Display value from 1st action
    console.log(val2); // Display items from 2nd action
    console.log(val3); // Display items from 3rd action
  });

Можете да намерите повече подробности за това разширение тук