派遣行动中途
Dispatch action midstream
RxJS 的新手。和 redux-observable.
我遇到了问题我正在尝试在下面的代码中发送一个动作中游 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
}
})
)
)
)
)
问题似乎出在您的 of(takeAction(res, reply))
上。具体来说,它是 .pipe(...)
。那就是将你的 "takeAction" 命令发送到 inside .pipe
的东西,而不是让它 "flow" 到你的 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))
不是 管道到任何东西。相反,它正在 "flowed" 返回到 Redux 商店。 merge
是一种流出内容的方法,同时创建另一个对操作流的订阅以临时监听另一个事件。
RxJS 的新手。和 redux-observable.
我遇到了问题我正在尝试在下面的代码中发送一个动作中游 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
}
})
)
)
)
)
问题似乎出在您的 of(takeAction(res, reply))
上。具体来说,它是 .pipe(...)
。那就是将你的 "takeAction" 命令发送到 inside .pipe
的东西,而不是让它 "flow" 到你的 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))
不是 管道到任何东西。相反,它正在 "flowed" 返回到 Redux 商店。 merge
是一种流出内容的方法,同时创建另一个对操作流的订阅以临时监听另一个事件。