1

我尝试在节点 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() {}
  }
);

更新:但没有 runSaga 的代码按预期工作,记录 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);
4

1 回答 1

0

看起来这是由于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 卡住了,但我假设没有收到unsubscribe函数subscribe会导致 redux-saga 内部的事情变得混乱。

于 2016-06-23T12:15:30.060 回答