2016-06-12 29 views
1

redux-sagaに全く新しいので、私はアクションLANGUAGE_START_CYCLEに反応し、アクションLANGUAGE_CYCLEを3秒ごとに循環させるサガを設定しようとしています。Redux Sagaを使用してX秒ごとにアクションを送信

しかし、私がLANGUAGE_START_CYCLEをReduxストアにディスパッチすると、サガLANGUAGE_CYCLEは決して実行されません。

私が間違っていることは何ですか?私は他のサガがうまく動いているので、それは単純な間違いであると思われる。作業している私の他のサガの一つの

// constants/ActionTypes.js 
export const LANGUAGE_SET_ACTIVE = "LANGUAGE_SET_ACTIVE"; 
export const LANGUAGE_START_CYCLE = "LANGUAGE_START_CYCLE"; 
export const LANGUAGE_STOP_CYCLE = "LANGUAGE_STOP_CYCLE"; 
export const LANGUAGE_CYCLE = "LANGUAGE_CYCLE"; 


// actions/language.js 
export const cycleLanguage =() => { 
    return { 
     type: ActionTypes.LANGUAGE_CYCLE 
    } 
};  

// languageSaga.js 
import { actionChannel, call, take, put, race } from 'redux-saga/effects' 
import * as ActionTypes from '../constants/ActionTypes'; 
import * as actions from '../actions/language'; 

const wait = ms => { 
    new Promise(resolve => { 
     setTimeout(() => resolve(), ms) 
    }) 
}; 

export default function * languageSaga() { 
    const channel = yield actionChannel(ActionTypes.LANGUAGE_START_CYCLE); 
    while (yield take(channel)) { 
     while (true) { 
      const { stopped } = yield race({ 
       wait: call(wait, 3000), 
       stopped: take(ActionTypes.LANGUAGE_STOP_CYCLE) 
      }); 

      if (!stopped) { 
       yield put(actions.cycleLanguage()); 
      } else { 
       break; 
      } 
     } 
    } 
} 


// sagas.js (root sagas) 
export default function * sagas() { 
    yield [ 
     directorySaga(), // Another saga which works fine 
     pusherSaga(), // Another saga which works fine 
     languageSaga() 
    ] 
} 

例:

// directorySaga.js 
function * fetchDirectory(action) { 
    try { 
     const directory = yield call(Api.fetchDirectory, action.id); 
     yield put(fetchDirectorySucceeded(directory)); 
    } catch (e) { 
     yield put(fetchDirectoryFailed(e.message)); 
    } 
} 

export default function * directorySaga() { 
    yield * takeLatest(ActionTypes.DIRECTORY_REQUESTED, fetchDirectory); 
} 
+0

申し訳ありませんが、実際に何がうまくいかないのかは分かりませんので、お手伝いするのは難しいです。あなたは何を派遣しますか、何を期待しますか、あなたは何を得ますか? –

+0

問題は、私が 'LANGUAGE_START_CYCLE'をディスパッチしたとき、サガはレースエフェクトを実行しないということです。私はどこにでもキャッチしようとしましたが、出力はありません。この問題のトラブルシューティング方法に関するヒント? – janhartmann

+0

ログを記録し、どのファイルが印刷されるかどうかを指定します。私はあなたがそこにループに入るかどうかわからない: –

答えて

1

私はここに私の質問に答えるつもりです。

上記のコードは動作していますが、アクションをトリガーしていたときに、私はRedux Dev Toolsを使用してアクションをストアに送りました。

私は手動で状態を変更した、ツールを使用してLANGUAGE_START_CYCLEを派遣 - どうやらこれは佐賀ミドルウェアに通知していなかったし、私のチャンネルが更新されなかった。

Redux Dev Tools dispatching

しかし、簡単なボタンを使用している場合私のコンポーネントの1つ:

<button onClick={() => dispatch(actions.startCycle())}> 
    Start 
</button> 
<button onClick={() => dispatch(actions.stopCycle())}> 
    Stop 
</button> 

佐賀ミドルウェアが通知されました。

UPDATE

マイストア構成は次のとおりです。

import { createStore, applyMiddleware, compose } from 'redux' 
import createSagaMiddleware from 'redux-saga'; 
import rootReducer from '../reducers/index'; 
import sagas from '../sagas/index'; 

export default function configureStore(initialState) { 
    const sagaMiddleware = createSagaMiddleware(); 
    const store = createStore(rootReducer, initialState, compose(
    applyMiddleware(sagaMiddleware), 
    window.devToolsExtension ? window.devToolsExtension() : f => f 
)); 

    if (module.hot) { 
    // Enable Webpack hot module replacement for reducers 
    module.hot.accept('../reducers',() => { 
     const nextReducer = require('../reducers'); 
     store.replaceReducer(nextReducer); 
    }); 
    } 

    sagaMiddleware.run(sagas); 

    return store; 
} 
+0

あなたはあなたの店をどのように作成するのか分かりますか?これは、間違ったミドルウェアの注文を使用している可能性があります。 –

+0

最新の回答をご覧ください。@SebastienLorber – janhartmann

+0

常にサガミドルウェアを最後に宣言してください。実際に最初に適用されます(アプリケーションリストは逆になります)。あなたの場合、devtoolsに渡すストアはまだsagaによって拡張されていません。つまり、devtoolsからのディスパッチは、ミドルウェアなしでReduxのraw dipatchです。 –

0

私はウェイト機能が誤ったタイプだと思います。 このように修正する必要があります。

関連する問題