Anu*_*aus 4 asynchronous yield-keyword redux redux-saga
我有一个名为initialiseApp的操作,该操作显然可以初始化应用程序。我需要服务器提供一些信息,例如用户信息,样式以及有关所显示页面(这是一个单页面应用程序)的详细信息。我正在使用redux-sagas,我想不出一种方法来链接异步操作,以使它们按顺序发生,而不是并行发生。
在请求任何样式信息之前,我需要先调用用户信息,因为在服务器端,对用户的调用转到并检索用户,并在会话中进行了一些设置。由于目前正在并行请求样式,因此显示错误,因为尚未在服务器上设置用户。
因此,我尝试使用put.sync,但这似乎不起作用,但是到目前为止,这是我的代码(顺便说一下,我也在使用TypeScript):
private *invokeAndWaitOn(action: IAction<any>) {
const putSync = (put as any).sync; // The typings file for redux-sagas does not yet include put.sync
yield putSync(action);
}
private *invokeArrayOfActions(actions: IAction<any>[]) {
for (let action of actions) {
yield* this.invokeAndWaitOn(action);
}
}
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用,我找不到如何正确使用redux-saga的put.sync效果的任何示例。
谁能看到我在做什么错,还是有更好/正确的方法来做到这一点?
提前致谢。
为了这个用例,我们假设您有两个操作fetchUser和fetchStyle。您想在第一个动作成功后立即触发第二个动作。
在这种情况下,您需要分别执行两个其他操作来处理成功和错误,以便您的操作如下:
对于用户取:fetchUser,fetchUserSuccess,和fetchUserError
对于风格取:fetchStyle,fetchStyleSuccess,和fetchStyleError
然后将整个获取过程包装起来sagaFunction,如下所示:
private* fetchUserSaga() {
try {
yield put(fetchUser());
let response = yield call(/* fetchUser API function */])
yield put(fetchUserSuccess(response));
} catch (err) {
yield put(fetchUserFailure(err));
}
}
Run Code Online (Sandbox Code Playgroud)
提示:您必须call从中使用效果redux-saga。
private* fetchStyleSaga() {
try {
yield put(fetchStyle());
let response = yield call(/* fetchStyle API function */])
yield put(fetchStyleSuccess(response));
} catch (err) {
yield put(fetchStyleFailure(err));
}
}
Run Code Online (Sandbox Code Playgroud)
然后将这些sagas函数传递给调用程序生成器函数,如下所示:
/*
const sagas = [
fetchUserSaga,
fetchStyleSaga,
]; */
private* invokeArrayOfSagas(sagas: ISaga<any>[]) {
for (let saga of sagas) {
yield call(saga()); /* saga: fetchUserSaga || fetchStyleSaga */
}
}
Run Code Online (Sandbox Code Playgroud)
这将等待直到fetchUserSaga完成,然后启动fetchStyleSaga。
更多信息:如果您想对一些动作进行分组并并行调用它们,而另一堆动作取决于它们,则可以使用一个yield关键字在数组中产生它们,请参见此处。
| 归档时间: |
|
| 查看次数: |
3379 次 |
| 最近记录: |