使用redux-sagas链接异步操作

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效果的任何示例。

谁能看到我在做什么错,还是有更好/正确的方法来做到这一点?

提前致谢。

Bas*_*awi 7

为了这个用例,我们假设您有两个操作fetchUserfetchStyle。您想在第一个动作成功后立即触发第二个动作

在这种情况下,您需要分别执行两个其他操作来处理成功错误,以便您的操作如下:

对于用户取:fetchUserfetchUserSuccess,和fetchUserError

对于风格取:fetchStylefetchStyleSuccess,和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关键字在数组中产生它们,请参见此处