7

我有一个名为 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);
    }
}

但这似乎不起作用,我找不到任何关于如何正确使用 redux-saga 的 put.sync 效果的示例。

谁能看到我做错了什么,或者有更好/正确的方法吗?

提前致谢。

4

1 回答 1

9

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

在这种情况下,您需要另外两个操作来处​​理成功错误,以便您的操作如下:

对于用户获取:fetchUserfetchUserSuccessfetchUserError

对于样式获取:fetchStylefetchStyleSuccessfetchStyleError

然后将整个获取过程包装起来,让我们说sagaFunction如下:

private* fetchUserSaga() {
  try {
    yield put(fetchUser());
    let response = yield call(/* fetchUser API function */])
    yield put(fetchUserSuccess(response));
  } catch (err) {
    yield put(fetchUserFailure(err));
  }
}

提示:你必须使用calleffect from 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));
  }
}

然后将这些 sagas 函数传递给您的调用程序生成器函数,如下所示:

/*
const sagas = [
  fetchUserSaga,
  fetchStyleSaga,
]; */

private* invokeArrayOfSagas(sagas: ISaga<any>[]) {
  for (let saga of sagas) {
    yield call(saga()); /* saga: fetchUserSaga || fetchStyleSaga */
  }
}

这将等到fetchUserSaga完成然后启动fetchStyleSaga

更多信息:如果你想对一些动作进行分组并并行调用它们,另一组动作依赖于它们,你可以用一个yield关键字将它们放在一个数组中,在此处查看更多信息。

于 2016-12-22T12:54:03.193 回答