Rxjs 中游调度行动
RxJS的新功能。并且可以观察到redux 我遇到问题,我正在尝试在下面的代码中调度(takeAction())的中游Rxjs 中游调度行动,rxjs,redux-observable,Rxjs,Redux Observable,RxJS的新功能。并且可以观察到redux 我遇到问题,我正在尝试在下面的代码中调度(takeAction())的中游操作,然后侦听来自此的响应操作,可以是RESOLVE\u TAKE类型,也可以是REJECT\u TAKE类型。但是我的(takeAction)的没有触发,有人知道如何修复下面的代码吗 除了这个问题,还有一个额外的好处:关于如何重构代码的任何风格建议,我不确定这是否是最干净、最可读的方式。我正在进行提取,然后在不同的状态代码上切换,然后获取res(提取的响应)和reply,如果可
操作,然后侦听来自此的响应操作,可以是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,并且没有研究任何可能存在的、订阅内部观测值的竞争条件。稍后我将尝试添加一个代码测试来确认并使其更清晰。非常感谢!!