RxJS的新手。而且可以观察到。
我在尝试在下面的代码中派发of(takeAction())
中间的操作时遇到麻烦,然后从中侦听RESOLVE_TAKE
类型或REJECT_TAKE
类型的响应操作。但是我的of(takeAction)
没有触发,有人知道如何在下面修复此代码吗?
除了这个问题之外,还有一个好处:关于如何重组代码的任何样式建议,我不确定它是否是最干净,最易读的方式。我正在进行提取,然后在不同的状态码上进行switch
,然后获取res
(提取响应)和reply
,并在可能的情况下将答复转为json,然后传递res
和reply
均作为takeAction
的参数。然后等待takeAction
管道调度RESOLVE_TAKE
或REJECT_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
}
})
)
)
)
)
答案 0 :(得分:1)
问题似乎出在您的of(takeAction(res, reply))
上。具体来说就是.pipe(...)
。这是将您的“ takeAction”命令发送到.pipe
内部 内的东西,而不是让它“流入”您的Redux商店。也许以下内容会更好:
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 merge(
of(takeAction(res, reply)),
action$.pipe(
ofType(RESOLVE_TAKE, REJECT_TAKE),
map(({ type }) => {
if (type === RESOLVE_TAKE) {
return resolveFooAction()
} else {
return rejectFooAction()
}
}),
),
)
}
// other res.status cases go here
}
})
)
)
)
)
在上面,of(takeAction(res, reply))
不是通过 传递到任何内容中的。相反,它被“流”回Redux存储。 merge
是一种流出内容的方法,同时可以为动作流创建另一个订阅以临时监听另一个事件。