了解rxjs6中的合并(特别是redux-observable)

Mag*_*nus 3 merge redux-observable rxjs6

上下文:我试图在获取资源后使用redux-observablewith 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 :(
}   
        )
    );
}    
Run Code Online (Sandbox Code Playgroud)

尝试执行此代码时,出现以下错误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
Run Code Online (Sandbox Code Playgroud)

那么这是什么问题呢?我希望merge在上面的代码中采用两种Observable<AnyAction>类型并返回一个Observable<AnyAction>类型(或一些更通用的类型,与Observable<AnyAction>我的史诗才能正常运行所需的兼容)。取而代之的是,我得到了一个不透明的类型OperatorFunction<{}, {} | AnyAction>,它显然与不兼容Observable<AnyAction>。有人可以在这里弄乱我的想法吗?merge我不是应该在这里使用运算符吗,还是我的整个rxjs-v6模式都不适合(看似简单的)目标,即在获取承诺的资源后触发多个操作?

m1c*_*4ls 10

您的代码还可以,但是您已经导入了merge运算符,而不是merge可观察的工厂

做就是了:

import { merge } from 'rxjs';
Run Code Online (Sandbox Code Playgroud)