Rxjs 中游调度行动

Rxjs 中游调度行动,rxjs,redux-observable,Rxjs,Redux Observable,RxJS的新功能。并且可以观察到redux 我遇到问题,我正在尝试在下面的代码中调度(takeAction())的中游操作,然后侦听来自此的响应操作,可以是RESOLVE\u TAKE类型,也可以是REJECT\u TAKE类型。但是我的(takeAction)的没有触发,有人知道如何修复下面的代码吗 除了这个问题,还有一个额外的好处:关于如何重构代码的任何风格建议,我不确定这是否是最干净、最可读的方式。我正在进行提取,然后在不同的状态代码上切换,然后获取res(提取的响应)和reply,如果可

RxJS的新功能。并且可以观察到redux

我遇到问题,我正在尝试在下面的代码中调度(takeAction())的中游
操作,然后侦听来自此的响应操作,可以是
RESOLVE\u TAKE
类型,也可以是
REJECT\u TAKE
类型。但是我的(takeAction)
没有触发,有人知道如何修复下面的代码吗

除了这个问题,还有一个额外的好处:关于如何重构代码的任何风格建议,我不确定这是否是最干净、最可读的方式。我正在进行提取,然后在不同的状态代码上切换
,然后获取
res
(提取的响应)和
reply
,如果可能,将reply转换为json,然后将
res
reply
作为参数传递给
takeAction
。然后等待
takeAction
管道发送
RESOLVE\u-TAKE
REJECT\u-TAKE

action$.pipe(
    ofType(START_FOO),
    switchMap({ url } =>
        from(fetch(url)).pipe(
            mergeMap(res => from(res.text()).pipe(
                mergeMap(reply => {
                    try { reply = JSON.parse(reply) } catch(ignore) {}
                    switch (res.status) {
                        case 200: {
                            return of(takeAction(res, reply)).pipe( // not dispatching
                                action$.pipe(
                                    ofType(RESOLVE_TAKE, REJECT_TAKE),
                                    mergeMap(({ type }) => {
                                        if (type === RESOLVE_TAKE) {
                                            return of(resolveFooAction())
                                        } else {
                                            return of(rejectFooAction())
                                        }
                                    })
                                )
                            )
                        }
                        // other res.status cases go here
                    }
                })
            )
        )
    )
)

问题似乎与您的(采取行动(回复))
有关。具体来说,它是
.pipe(…)
。这是将您的“takeAction”命令发送到
.pipe
中的内容,而不是让它“流”到您的Redux存储中。也许像下面这样的方法会更好:

action$.pipe(
类型(START_FOO),
开关映射({url}=>
从(获取(url)).pipe(
合并映射(res=>from(res.text()).pipe(
合并映射(回复=>{
试一试{
reply=JSON.parse(reply)
}捕获(忽略){
}
开关(恢复状态){
案例200:{
返回合并(
(采取行动(回复)),
动作$.pipe(
类型(解决、拒绝),
映射({type})=>{
如果(类型===RESOLVE\u TAKE){
返回resolveFooAction()
}否则{
返回操作()
}
}),
),
)
}
//其他res.status案例也在这里
}
})
)
)
)
)

在上面的例子中,(takeAction(res,reply))
并没有通过管道传输到任何东西中。相反,它被“流”回Redux商店。
合并
是一种流出来的方式,同时,创建对动作流的另一个订阅,以临时监听另一个事件。

Oh wow“发送你的消息”takeAction“command to the stuff the stuff the.pipe”我想这只是让一些东西点击了一下,非常感谢您的解决方案!我还看到您为我保留了类似的样式指南,这让我觉得“是的!我认为我做的事情是正确的rxjs!”谢谢!:)如果不围绕它进行
合并
,情况会有什么不同,我们做了一个
concat
merge
是否使这两件事并行发生?@Noitidart是的,并行与顺序。我承认,我是在偷懒地选择合并而不是concat,并且没有研究任何可能存在的、订阅内部观测值的竞争条件。稍后我将尝试添加一个代码测试来确认并使其更清晰。非常感谢!!