redux-saga 注入了两次
redux-saga injected twice
我有一个 redux-saga 被调用了一次,但它执行了两次。
这是开始传奇的动作:
export function createRequest (data) {
return {
type: CREATE_REQUEST,
payload: {data}
};
}
我的 sagas.js 文件看起来是这样的:
export function* create (x) {
try {
const response = yield call(request, URL_TO_API, Object.assign({}, buildBaseHeaders('en'), {
method: 'post',
body: JSON.stringify(x.payload.data)
}));
yield put(createSuccess(response));
} catch (error) {
yield put(createFailure(error));
}
}
... my other sagas
export default function* defaultSaga () {
yield takeLatest(CREATE_REQUEST, create);
... my other calls
}
我将 sagas 注入我的 React 组件的方式是这样的:
const withConnect = connect(mapStateToProps, mapDispatchToProps);
const withReducer = injectReducer({key: 'myComponent', reducer});
const withSaga = injectSaga({key: 'myComponent', saga});
export default compose(withReducer, withSaga, withConnect) MyComponent;
但是saga被注入了两次。那么,我在这里错过了什么?无论 MyComponent 被渲染多少次,我如何只注入一次 saga?
But the saga is injected twice. So, what am I missing here?
解决方案取决于 redux-sagas-injector
npm 库的工作方式。一般情况下,异步加载和申请sagas是一件很困难的事情,因为saga
是由"live"个进程管理器组成的,在某些函数调用或对象删除时无法处理。
这暗示了 saga 启动自定义报价回调域(Promises、AJAX/XHR、setImmediate
等)的能力,这些域不能从自定义外部代码中处理(这也是为什么 HMR 不能与 sagas
在部分模式下,应该重新加载整个页面)。
因此,如果您在路由器切换上执行 saga
注入,请检查两件事:旧的 saga 具有从外部处理的隐式操作,例如特殊的内部技术处理操作,并且没有错误配置路由器端 - 可能启动了同一页面,例如启动了两次。
我有一个 redux-saga 被调用了一次,但它执行了两次。
这是开始传奇的动作:
export function createRequest (data) {
return {
type: CREATE_REQUEST,
payload: {data}
};
}
我的 sagas.js 文件看起来是这样的:
export function* create (x) {
try {
const response = yield call(request, URL_TO_API, Object.assign({}, buildBaseHeaders('en'), {
method: 'post',
body: JSON.stringify(x.payload.data)
}));
yield put(createSuccess(response));
} catch (error) {
yield put(createFailure(error));
}
}
... my other sagas
export default function* defaultSaga () {
yield takeLatest(CREATE_REQUEST, create);
... my other calls
}
我将 sagas 注入我的 React 组件的方式是这样的:
const withConnect = connect(mapStateToProps, mapDispatchToProps);
const withReducer = injectReducer({key: 'myComponent', reducer});
const withSaga = injectSaga({key: 'myComponent', saga});
export default compose(withReducer, withSaga, withConnect) MyComponent;
但是saga被注入了两次。那么,我在这里错过了什么?无论 MyComponent 被渲染多少次,我如何只注入一次 saga?
But the saga is injected twice. So, what am I missing here?
解决方案取决于 redux-sagas-injector
npm 库的工作方式。一般情况下,异步加载和申请sagas是一件很困难的事情,因为saga
是由"live"个进程管理器组成的,在某些函数调用或对象删除时无法处理。
这暗示了 saga 启动自定义报价回调域(Promises、AJAX/XHR、setImmediate
等)的能力,这些域不能从自定义外部代码中处理(这也是为什么 HMR 不能与 sagas
在部分模式下,应该重新加载整个页面)。
因此,如果您在路由器切换上执行 saga
注入,请检查两件事:旧的 saga 具有从外部处理的隐式操作,例如特殊的内部技术处理操作,并且没有错误配置路由器端 - 可能启动了同一页面,例如启动了两次。