Мне кажется, я не совсем понимаю ваш вариант использования, но основное различие между concatMap
и concat
заключается в том, что concatMap
принимает в качестве параметра функцию, которая вызывается для каждого элемента из его источника и которая возвращает внутренняя наблюдаемая (она отображает каждый элемент из своего источника в наблюдаемую). concatMap
затем вызывает свой обратный вызов только тогда, когда завершаются предыдущие внутренние Observables.
С другой стороны, concat
просто принимает список наблюдаемых, которые подписываются на них один за другим, когда завершается предыдущая наблюдаемая.
Так что в вашем случае первый пример просто "сопоставляет" FAKE_LOGIN_AUTHENTICATING
с FAKE_LOGIN_SUCCESS
.
Во втором примере внутренний блок эквивалентен этому:
concat(
of({ type: 'FAKE_LOGIN_AUTHENTICATING' }),
of({ type: 'FAKE_LOGIN_SUCCESS', payload: { userId: 'user-a', userData: {}}}).pipe(
delay(2000),
)
)
Итак, сначала он подписывается на of({ type: 'FAKE_LOGIN_AUTHENTICATING' })
, который генерирует и завершает немедленно, а затем подписывается на of({ type: 'FAKE_LOGIN_SUCCESS'...)
, который также генерирует немедленно и затем завершает.