Javascript 当其中一个失败时,redux传奇会产生所有取消其他效果
我对saga效应中的收益率有问题,我在下面提供了我的示例代码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
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块将在抛出错误后立即运行,而其他非错误承诺仍在运行