2016-06-22 8 views
0

ノード6.2.1で次のコードを実行しようとしました。それは1,2,を記録し、次にスタックします。なぜ私はそれが行収量take( 'TEST')に実行を継続しないのか、undestandできません...別の佐賀が終了し、2を記録すると思われるが、制御はrootSagaに返されない。誰も私を助けることができますか?Redux-sagaがyieldコールでスタックされています

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); 
+0

runSagaなしでこのコードを試しましたか? – kuy

+0

@kuy私は試しましたが、期待どおりに動作します。メイントピックのコードを見てください。 –

答えて

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' } 

これはあなたの武勇伝がスタックになった原因どのようにそれは奇妙だが、印刷を通じてそれをループを見ることができたが、私はsubscribeからunsubscribe関数を受け取っていないと、redux-sagaで内部的にうんざりしてしまったと仮定しています。

+0

ありがとう!私は逃しました。しかし、yelouafi [githubに追加](https://github.com/yelouafi/redux-saga/issues/401#issuecomment-228019459)では、clearIntervalを返すだけでは十分ではないことに注意してください。 "購読機能は複数の購読の登録をサポートする必要があります。" –

+0

特定のサブスクリプションのintervalIdは、私たちがビルドしたunsubscribe関数によって作成されたクロージャでキャプチャされるため、実際にはうまくいくと思います。だからあなたはサブスクライブを複数回呼び出すことができ、それぞれの関数はそれぞれの関数が適切なintervalIdに束縛されるので、それらを返す関数で個別にアンサブスクライブすることができます。 – rayd

関連する問題