Понимание слияния в rxjs6 (и, в частности, наблюдаемого с редукцией)

Контекст: я пытаюсь использовать 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 неверен для (на первый взгляд) простой цели запуска нескольких действий после получения обещанного ресурса?


person Magnus    schedule 20.08.2018    source источник


Ответы (1)


Ваш код в порядке, но вы импортировали merge вместо mergeзаметный завод

Просто делать:

import { merge } from 'rxjs';
person m1ch4ls    schedule 20.08.2018
comment
Ааа! Огромное спасибо! - person Magnus; 21.08.2018
comment
Подошел, чтобы сказать, что это помогло мне в моем вопросе observables/54631116#54631116" title="запустите несколько действий и подождите, пока они разрешат rxjs redux observables"> stackoverflow.com/questions/54621370/. Я потратил целую вечность, пытаясь понять, почему это не работает, и все это было связано с импортом, так что спасибо!! - person woolm110; 11.02.2019
comment
Просто была такая же проблема с concat в качестве оператора вместо фабрики... Спасибо! - person VinceOPS; 01.05.2019