Контекст: я пытаюсь использовать redux-observable
с rxjs v6
для запуска нескольких действий после извлечения ресурса.
Проблема: я могу запустить одно действие после извлечения ресурса без проблем; но моя попытка вызвать несколько действий поставила меня в тупик. В частности, показанная ниже моя попытка использовать rxjs merge
для запуска нескольких действий кажется настолько стандартной и близкой к задокументированным примерам (см., например, здесь), что я не могу понять, где я ошибаюсь. Вот разбивка моего кода с типами машинописных текстов, указанными в комментариях; Я упростил вещи ради ясности проблемы:
import { from } from "rxjs";
import { merge, mergeMap, map } from "rxjs/operators";
import { AnyAction } from "redux";
... //Setup related to rxjs-observable epics
function myEpic(
action$: Observable<AnyAction>,
state$: any,
{fetchPromisedStrings}: any
) {
return action$.pipe(
ofType('MY_ACTION'),
mergeMap(
action =>
{
const demoAction1: AnyAction = {type:'FOO1', payload:'BAR1'};
const demoAction2: AnyAction = {type:'FOO2', payload:'BAR2'};
const w = from(fetchPromisedStrings()) //const w: Observable<string[]>
const x = w.pipe( map(() => demoAction1)); //const x: Observable<AnyAction>
const y = w.pipe( map(() => demoAction2)); //const y: Observable<AnyAction>
//My attempt to merge observables:
const z = merge(x,y); // const z: OperatorFunction<{}, {} | AnyAction>
// return x; // Works :)
// return y; // Works :)
return z; // Doesn't work :(
}
)
);
}
Этот код дает мне следующую ошибку, когда я пытаюсь return z
:
TypeError: You provided 'function (source) { return source.lift.call(_observable_merge__WEBPACK_IMPORTED_MODULE_0__["merge"].apply(void 0, [source].concat(observables))); }' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable
Так в чем же проблема? Я ожидаю, что merge
в приведенном выше коде возьмет два типа Observable<AnyAction>
и вернет один тип Observable<AnyAction>
(или какой-то более общий тип, совместимый с Observable<AnyAction>
, который нужен моему эпику для правильной работы). Вместо этого я получаю какой-то непрозрачный тип с именем OperatorFunction<{}, {} | AnyAction>
, который, очевидно, не совместим с Observable<AnyAction>
. Может ли кто-нибудь распутать мои мысли здесь? Является ли merge
не тем оператором, который я должен использовать здесь, или весь мой шаблон rxjs-v6
неверен для (на первый взгляд) простой цели запуска нескольких действий после получения обещанного ресурса?