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 のないコードは期待どおりに機能します

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 となるの結果を返しています。代わりに、 docsに従って、redux-saga がイベントのサブスクライブを解除するために使用できる関数を返す必要があります。したがって、subscribe関数は次のようになります。

subscribe(callback) {
  const intervalId = setInterval(() => (callback({type: 'TEST'})), 1000);
  return () => { clearInterval(intervalId); };
},

これで実行すると、印刷がループするのを見ることができました

1
2
3
4
{ type: 'TEST' }

これがどのようにしてあなたのサガが動けなくなったのかは奇妙ですが、unsubscribe関数を受け取っていないことsubscribeが原因で redux-saga の内部がめちゃくちゃになったと思います。

于 2016-06-23T12:15:30.060 に答える