我对反应性编程非常陌生,我想将下面的代码从redux-saga转换为redux-observable。
这样做的目的是等待一些API调用,等待5s并调度另一个操作。
function* mySaga(action) {
const response = yield call(someApiCall);
yield call(delay, 5000);
yield put({ type: 'ACTION' });
}下面是我在redux--可观察到的--中如何做的:
action$
.ofType('SOME_ACTION')
.mergeMap(someApiCall)
.delay(5000)
.map(() => ({ type: 'ACTION' }))发布于 2017-09-15 20:01:31
假设您在原始示例中省略了yield takeEvery('SOME_ACTION', mySaga)内容,您的翻译是准确的。
不过,我建议隔离您的可观察链;将所有要应用的内容放在someApiCall()之后,在mergeMap中
action$
.ofType('SOME_ACTION')
.mergeMap(action =>
someApiCall()
.delay(5000)
.map(() => ({ type: 'ACTION' }))
)尽管这在您的示例中没有什么不同,但如果您或某个团队成员稍后进来并尝试添加错误处理,关键是不要让错误气泡出现在mergeMap之外。
action$
.ofType('SOME_ACTION')
.mergeMap(action =>
someApiCall()
.delay(5000)
.map(() => ({ type: 'ACTION' }))
.catch(error => Observable.of({
type: 'SOME_ACTION_FAILED',
payload: error
}))
)如果您将catch放置在可观察到的顶层,在mergeMap之后,错误将冒泡到顶级链,虽然您会捕捉到错误,但您的史诗将不再监听未来的操作。
如果不清楚原因,我建议学习更多关于可观察+操作员如何工作的知识--我保证没有那么可怕!这是一个伟大的视频,甚至触及“隔离您的观察链”,以捕捉错误在正确的点。https://youtu.be/3LKMwkuK0ZE?t=20m15s
https://stackoverflow.com/questions/46236921
复制相似问题