Javascript 当其中一个失败时,redux传奇会产生所有取消其他效果

Javascript 当其中一个失败时,redux传奇会产生所有取消其他效果,javascript,reactjs,redux,redux-saga,Javascript,Reactjs,Redux,Redux Saga,我对saga效应中的收益率有问题,我在下面提供了我的示例代码 function* fetchData(item) { try { const data = yield call(request, url); yield put(fetchDataSuccess(data)); } catch (error) { yield put(fetchDataFailure(error)); throw error; } } function* fetchSu

我对saga效应中的收益率有问题,我在下面提供了我的示例代码

function* fetchData(item) {
  try {
    const data = yield call(request, url);
    yield put(fetchDataSuccess(data));
  } catch (error) {
    yield put(fetchDataFailure(error));
    throw error;
  }
}

function* fetchSummary(action) {
  try {
      yield all(
        list.map(item=>
          call(fetchData, item)
        )
      );
  } catch (error) {
    yield put(
      enqueueSnackbar({
        message: "Has Error",
        options: { variant: "error" }
      })
    );
  }
}
其逻辑是我想调用多个请求(一些成功,一些失败)

预期:如果请求失败,则在生成所有成功请求后将捕获错误,但这些成功请求仍在继续,并且在单个成功请求后应发送操作“FetchDataSucces”(Promise.all可以这样做)

实际:如果请求失败,则在产生所有错误后将捕获错误,然后saga立即取消所有其他“fetchData”调用

谁能帮我实现这个逻辑。提前感谢。

您描述的“实际”行为符合我在您的代码中看到的情况。一旦抛出任何错误,我们就离开
try
块,进入
catch

当我们
产生一系列效果时,生成器将被阻止,直到所有效果得到解决或一个效果被拒绝(就像
Promise.all
的行为一样)

如果要执行每个
获取
,则需要将
尝试
/
捕获
放在
.map
中。您可以映射到
true
/
false
值的数组,也可以设置错误值。或者,如果您不介意有多个snackbar,您可以
将其放入
fetchData
中,而不是
fetchSummary

这里有一种方法:

// modified to return either true or false
function* fetchData(item) {
  try {
    const data = yield call(request, item);
    yield put(fetchDataSuccess({ item, data }));
    return true;
  } catch (error) {
    yield put(fetchDataFailure({ item, error }));
    return false;
  }
}

function* fetchSummary(action) {
  const results = yield all(
    action.payload.list.map((item) => call(fetchData, item))
  );
  // check if any of the results were false;
  const hasError = results.some((res) => !res);
  if (hasError) {
    yield put(
      enqueueSnackbar({
        message: "Has Error",
        options: { variant: "error" }
      })
    );
  }
}

是的,这与承诺非常相似。所有成功承诺仍然有效,即使其他承诺失败。唯一不同的是,我们只能在所有承诺都完成时吐司消息,例如Promise.all,catch块将在抛出错误后立即运行,而其他非错误承诺仍在运行