在一个假设的应用程序中,用户可以创建一本书,默认情况下这本书有3页。一旦增加了书和页,我想对书和页做一些其他的事情。在我的redux存储中,书籍和页面是两个独立的减缩器,在我的数据库中也是两个表。我现在的流程是:
正如上面提到的,在执行步骤4和步骤5之后,我想用这本书做一些其他的事情,但我不确定这方面的最佳方法。为了让它现在运行,目前我有一个setTimeout函数,它运行检查新书和3页的bookId。如果书和3页在商店,做其他的事情,如果没有,再次运行超时。我觉得这不是最好的办法。*微笑:
发布于 2018-08-27 17:33:14
Gosha在他的文章用Redux-Saga检测状态变化中描述了一个可能的解决方案。
在那篇文章中,他建议编写一个waitFor
函数,在提供的选择器最终返回true
时返回该函数。
function* waitFor(selector) {
if (yield select(selector)) return; // (1)
while (true) {
yield take('*'); // (1a)
if (yield select(selector)) return; // (1b)
}
}
它可以这样使用:
function* someSaga() {
yield call(waitFor, state => getCurrentUser(state) != null);
// the user is logged in by now
}
另一个可能的解决方案是一个更简单的自定义中间件,它在动作分派后进行检查。
发布于 2018-08-27 17:38:40
你有几个选择。
1)在您的React组件中,您可以连接到还原器在ADD_PAGES_SUCCESS时更新的状态。在componentWillReceiveProps
中,您可以检查连接的状态,并在步骤(5)之后从组件中分派要执行的操作。
...not很好,因为componentWillReceiveProps
可以快速获得毛茸茸,并且在可能的情况下应该避免。
2)使用redux-thunk或redux-saga:
使用Redux-saga,在您的操作处理程序(Saga)中,您可以对服务器响应执行take
操作,并执行诸如有条件地进行API调用和yield
(等待)之类的操作,此时您可以触发(put
)更多的操作,或者进行更多的API调用,或者做任何您想做的事情。这不会取代你的减速器,也不会改变你的还原状态。
示例:
// worker Saga: will be fired on ADD_PAGES_SUCCESS actions
function* doStuffAfterAddPages(action) {
while (true) {
yield take(ADD_PAGES_SUCCESS);
try {
let moreData;
const result = yield call(api.doSomethingElse);
if (result.isExpected) {
moreData = yield call(api.doOtherStuff);
} else {
moreData = yield call(api.doOtherStuff);
}
yield put(OTHER_STUFF_COMPLETE, { data: moreData });
} catch (error) {
yield put(OTHER_STUFF_FAILED, { error: error.message);
}
}
}
https://stackoverflow.com/questions/52044079
复制相似问题