Redux-saga 卡在 yield 调用上
Redux-saga is stuck on yield call
我尝试 运行 节点 6.2.1 上的下一个代码。它记录 1, 2, 然后卡住了。我不明白为什么它不继续执行到行 yield take('TEST')... 似乎 anotherSaga 完成并记录 2 但控制没有返回到 rootSaga。谁能帮帮我?
const {runSaga, delay} = require('redux-saga');
const {take, put, call} = require('redux-saga/effects');
function* anotherSaga() {
yield call(delay, 1000);
console.log(2);
}
function* rootSaga() {
while(true) {
console.log(1);
yield call(anotherSaga);
console.log(3);
const action = yield take('TEST');
console.log(4);
yield put(action);
}
}
runSaga(
rootSaga(),
{
subscribe(callback) {
return setInterval(() => (callback({type: 'TEST'})), 1000);
},
dispatch(action) {
console.log(action);
},
getState() {}
}
);
Update:但没有 运行Saga 的代码按预期工作,记录 1,2,3,4
const {createStore, applyMiddleware} = require('redux');
const createSagaMiddleware = require('redux-saga').default;
const {delay} = require('redux-saga');
const {take, put, call} = require('redux-saga/effects');
function* anotherSaga() {
yield call(delay, 2000);
console.log(2);
}
function* rootSaga() {
while(true) {
console.log(1);
yield call(anotherSaga);
console.log(3);
const action = yield take('TEST');
console.log(4);
yield put(action);
console.log('---')
}
}
const rootReducer = (state, action) => {
if (state === undefined) {
return {};
}
return state;
}
const sagaMiddleware = createSagaMiddleware();
const store = createStore(rootReducer, {}, applyMiddleware(sagaMiddleware));
sagaMiddleware.run(rootSaga);
setInterval(() => (store.dispatch({type: 'TEST'})), 1000);
看起来这是因为 subscribe
函数没有返回正确的值。上面它返回 setInterval
的结果,这将是间隔的 ID。相反,它应该返回一个 redux-saga 可以用来取消订阅事件的函数,根据 docs。所以你的 subscribe
函数应该看起来更像这样:
subscribe(callback) {
const intervalId = setInterval(() => (callback({type: 'TEST'})), 1000);
return () => { clearInterval(intervalId); };
},
运行 有了这个,我能够看到它通过打印循环
1
2
3
4
{ type: 'TEST' }
奇怪的是这导致你的 saga 卡住了,但我假设没有从 subscribe
接收到 unsubscribe
函数导致 redux-saga 内部变得混乱。
我尝试 运行 节点 6.2.1 上的下一个代码。它记录 1, 2, 然后卡住了。我不明白为什么它不继续执行到行 yield take('TEST')... 似乎 anotherSaga 完成并记录 2 但控制没有返回到 rootSaga。谁能帮帮我?
const {runSaga, delay} = require('redux-saga');
const {take, put, call} = require('redux-saga/effects');
function* anotherSaga() {
yield call(delay, 1000);
console.log(2);
}
function* rootSaga() {
while(true) {
console.log(1);
yield call(anotherSaga);
console.log(3);
const action = yield take('TEST');
console.log(4);
yield put(action);
}
}
runSaga(
rootSaga(),
{
subscribe(callback) {
return setInterval(() => (callback({type: 'TEST'})), 1000);
},
dispatch(action) {
console.log(action);
},
getState() {}
}
);
Update:但没有 运行Saga 的代码按预期工作,记录 1,2,3,4
const {createStore, applyMiddleware} = require('redux');
const createSagaMiddleware = require('redux-saga').default;
const {delay} = require('redux-saga');
const {take, put, call} = require('redux-saga/effects');
function* anotherSaga() {
yield call(delay, 2000);
console.log(2);
}
function* rootSaga() {
while(true) {
console.log(1);
yield call(anotherSaga);
console.log(3);
const action = yield take('TEST');
console.log(4);
yield put(action);
console.log('---')
}
}
const rootReducer = (state, action) => {
if (state === undefined) {
return {};
}
return state;
}
const sagaMiddleware = createSagaMiddleware();
const store = createStore(rootReducer, {}, applyMiddleware(sagaMiddleware));
sagaMiddleware.run(rootSaga);
setInterval(() => (store.dispatch({type: 'TEST'})), 1000);
看起来这是因为 subscribe
函数没有返回正确的值。上面它返回 setInterval
的结果,这将是间隔的 ID。相反,它应该返回一个 redux-saga 可以用来取消订阅事件的函数,根据 docs。所以你的 subscribe
函数应该看起来更像这样:
subscribe(callback) {
const intervalId = setInterval(() => (callback({type: 'TEST'})), 1000);
return () => { clearInterval(intervalId); };
},
运行 有了这个,我能够看到它通过打印循环
1
2
3
4
{ type: 'TEST' }
奇怪的是这导致你的 saga 卡住了,但我假设没有从 subscribe
接收到 unsubscribe
函数导致 redux-saga 内部变得混乱。