【发布时间】:2022-01-26 11:07:37
【问题描述】:
您好,我正在尝试使用新的 redux 工具包实现 saga,但不幸的是,当我启用新的 slice reducers saga 时,它并没有触发 saga。
rootSaga.ts
export function* rootSaga() {
yield all([
fork(userSaga),
fork(vehicleSaga),
fork(locationSaga),
fork(departmentSaga),
fork(vehicleTypeSaga),
fork(authSaga),
fork(materialSaga), <---- others are normal old redux sagas.
fork(workTypeSaga), <----- Slice saga make with createSlice.
]);
}
当我从下面的代码中删除 workTypesaga 时,它可以正常工作。当将 workTypeSaga 直接传递给 sagaMiddleware.run() 时,它也可以工作。但是像这样的多个 sagas 是行不通的。
我知道组合多个 saga 并使用工具包运行存在问题。但是现在有什么解决办法吗?
编辑: 这是 workTypesaga.ts 文件。是的,很长。
import { put, takeLatest } from "redux-saga/effects";
// import {
// getWorkTypesStart,
// getWorkTypesSuccess,
// getWorkTypesError,
// createWorkTypeStart,
// createWorkTypeSuccess,
// createWorkTypeError,
// } from "@toilcrew/common/reducers/slices/workTypeSlice";
import * as WorkTypeSlice from "@toilcrew/common/reducers/slices/workTypeSlice";
import { routes } from "../config";
import apiService from "../services/common.services";
import commonServices from "../services/common.services";
import { selectWorkTypePageNo } from "../selectors/workType.selector";
import { useSelector } from "react-redux";
function* getMultipleWorkTypeSaga(action) {
console.log("action", action);
const params = {
method: "get",
// route: `${routes.workType}?order_by=v_id&${addQueries}`,
route: routes.workType,
data: action.payload,
};
try {
const res = yield commonServices(params);
yield put(WorkTypeSlice.getWorkTypesSuccess(res));
} catch (error) {
yield put(WorkTypeSlice.getWorkTypesError(error));
console.log(error.response.data);
}
}
function* createWorkTypeSaga(action) {
console.log("action", action.payload);
const params = {
method: "post",
// route: `${routes.workType}?order_by=v_id&${addQueries}`,
route: routes.workTypeBulk,
data: action.payload,
};
try {
const res = yield apiService(params);
yield put(WorkTypeSlice.createWorkTypeSuccess("message.vehicleCreated"));
// const pageno = yield select(pagenoSelector);
yield put(WorkTypeSlice.getWorkTypesStart(1));
} catch (error) {
console.log(error.response.data);
yield put(WorkTypeSlice.createWorkTypeError(error));
}
}
function* getSingleWorkTypeSaga({ payload }) {
console.log("getWorkTypeSaga - payload: ", payload);
const params = {
method: "get",
route: `${routes.workType}/${payload}`,
};
try {
//@ts-ignore
const workType = yield call(commonServices, params);
console.log("from update sage", workType);
yield put(WorkTypeSlice.getSingleWorkTypeSuccess(workType));
} catch (error) {
console.log(error?.response?.data);
yield put(WorkTypeSlice.getSingleWorkTypeError(error?.response?.data));
}
}
function* updateWorkTypeSaga({ payload }) {
console.log("getWorkTypeSaga - payload: ", payload);
const params = {
method: "patch",
route: routes.workType,
data: payload,
};
try {
//@ts-ignore
const vehicle = yield call(vehicleServices, params);
yield put(WorkTypeSlice.updateWorkTypeSuccess("message.updateSuccess"));
const pageno = yield useSelector(selectWorkTypePageNo);
yield put(WorkTypeSlice.updateWorkTypeError(pageno));
} catch (error) {
console.log(error?.response?.data);
yield put(WorkTypeSlice.updateWorkTypeError("error.500Message1"));
}
}
function* toggleSingleWorkTypeStatusSaga({ payload }) {
console.log("toggleWorkTypeSaga - payload: ", payload);
const params = {
method: "patch",
route: `${routes.workType}/${payload.wt_id}`,
data: payload,
};
try {
//@ts-ignore
const vehicle = yield call(vehicleServices, params);
yield put(WorkTypeSlice.updateWorkTypeSuccess("message.updateSuccess"));
const pageno = yield useSelector(selectWorkTypePageNo);
yield put(WorkTypeSlice.getWorkTypesStart(pageno));
} catch (error) {
console.log(error?.response?.data);
yield put(WorkTypeSlice.updateWorkTypeError("error.500Message1"));
}
}
function* deleteSingleWorkTypeSaga({ payload }) {
console.log("deleteworkTypeSaga - payload: ", payload);
const params = {
method: "delete",
route: `${routes.workType}/${payload}`,
// data: payload,
};
console.log("delete url: ", params.route);
try {
//@ts-ignore
const vehicle = yield call(commonServices, params);
yield put(
WorkTypeSlice.deleteSingleWorkTypeSuccess("message.deleteSuccess")
);
const pageno = yield useSelector(selectWorkTypePageNo);
yield put(WorkTypeSlice.getWorkTypesStart(pageno));
} catch (error) {
console.log(error?.response?.data);
yield put(WorkTypeSlice.deleteSingleWorkTypeError("error.500Message1"));
}
}
function* workTypeSaga() {
yield takeLatest(WorkTypeSlice.createWorkTypeStart.type, createWorkTypeSaga);
yield takeLatest(
WorkTypeSlice.getWorkTypesStart.type,
getMultipleWorkTypeSaga
);
yield takeLatest(
WorkTypeSlice.getSingleWorkTypeStart.type,
getSingleWorkTypeSaga
);
yield takeLatest(WorkTypeSlice.updateWorkTypeStart.type, updateWorkTypeSaga);
yield takeLatest(
WorkTypeSlice.toggleSingWorkTypeStatusStart.type,
toggleSingleWorkTypeStatusSaga
);
yield takeLatest(
WorkTypeSlice.deleteSingleWorkTypeStart.type,
deleteSingleWorkTypeSaga
);
}
export default workTypeSaga;
【问题讨论】:
-
在您的问题中包含
workTypeSaga的代码。 -
很难猜测出了什么问题。您确定您的 workTypeSaga 没有未捕获的错误吗?可能只有在同时运行新旧 sagas 时才会发生某些事情。有人认为您可以尝试在根传奇中使用
spawn而不是fork,看看这是否会改变任何东西。 redux-saga.js.org/docs/advanced/RootSaga#keeping-the-root-alive 这可能无法修复潜在的错误,但它可以帮助诊断/识别正在发生的事情。 -
好吧,这是我使用 spawn 时遇到的错误。由于错误而取消的任务:takeLatest(workType/createWorkTypeStart, createWorkTypeSaga) logError @ io-6de156f3.js?5a59:112
-
fork 也会发生该错误。应该有更多关于错误的信息,对吧?确保将有效参数传递给 takeLatest。您还可以在 sagas 中添加一些 try-catch 块,以便在错误冒泡到父 sagas 之前捕获它们。
标签: reactjs react-redux next.js redux-saga redux-toolkit