2016-08-27 18 views
5

私はreduxに反応しました。 Redux Sagaを試してみて、理解できないエラーメッセージが表示されました。 これは私のrootSagaです:Redux saga "rootSagaがキャンセルされました"

import { takeEvery } from 'redux-saga'; 
import { AUTH_LOAD_SUCCESS,AUTH_SIGNUP,AUTH_SIGNIN,AUTH_SIGNOUT } from '../reducers/auth'; 
import { receiveAuth,signUp,signIn,onSignOut } from './auth'; 

export default function* rootSaga(){ 
    yield [ 
     takeEvery('AUTH_LOAD_SUCCESS', receiveAuth), 
     takeEvery('AUTH_SIGNUP', signUp), 
     takeEvery('AUTH_SIGNOUT',onSignOut), 
     takeEvery('AUTH_SIGNIN', signIn)   
] 

}

サインインして新規アカウントは私のために完璧に動作しますが、その後、私は私のコンソールで次のエラーメッセージを取得します。ですから、私はredux-sagaを使ってログインすることはできますが、エラーメッセージごとに「キャンセル」されているため、SignOutをおそらく動作させることはできません。誰かが私に何が起こっているのか説明してもらえますか?おかげ

bundle.js:79457 uncaught at check call: argument fn is undefinedlog @ bundle.js:79457 
bundle.js:79457 rootSaga has been cancelled 
bundle.js:79457 uncaught at rootSaga 
at rootSaga 
at signIn 
Error: call: argument fn is undefined 
    at check (http://127.0.0.1:3000/dist/bundle.js:79313:12) 
    at getFnCallDesc (http://127.0.0.1:3000/dist/bundle.js:80311:21) 
    at call (http://127.0.0.1:3000/dist/bundle.js:80336:24) 
    at signIn$ (http://127.0.0.1:3000/dist/bundle.js:81213:47) 
    at tryCatch (http://127.0.0.1:3000/dist/bundle.js:7893:41) 
    at GeneratorFunctionPrototype.invoke [as _invoke] (http://127.0.0.1:3000/dist/bundle.js:8167:23) 
    at GeneratorFunctionPrototype.prototype.(anonymous function) [as next] (http://127.0.0.1:3000/dist/bundle.js:7926:22) 
    at next (http://127.0.0.1:3000/dist/bundle.js:79727:28) 
    at currCb (http://127.0.0.1:3000/dist/bundle.js:79801:8) 
    at http://127.0.0.1:3000/dist/bundle.js:79904:17 

追加情報:

sagas/auth.js 
import 'babel-polyfill'; 
import fetch from 'isomorphic-fetch' 
import { browserHistory } from 'react-router'; 
import cookie from 'react-cookie'; 
import { put,call,select } from 'redux-saga/effects'; 
import { requestSignUp,requestSignIn,requestSignOut,receiveUser,receiveSignIn,receiveSignOut } from '../reducers/auth' 



export function* onSignOut(){ 

/////////////////ignore this for the moment/////// 
console.log("ffss") 

} 

export function* receiveAuth() { 
    const user = cookie.load('username'); 

    yield put(receiveAuth(user)); 
    } 

export function* signUp(action) { 
    yield put(requestSignUp()) 
    try { 
     const response = yield call(fetch,'/api/sign_up', { 
        method:'POST', 
        headers:{'Accept': 'application/json', 'Content-Type': 'application/json'}, 
        body: JSON.stringify(action.payload) /////action.payload contains {username:'aa',password:'aa'} 
        }) 
     if(response.ok){ 
      yield call(cookie.save,'username', action.payload.username) 
      yield put(receiveUser(action.payload.username)) 
      yield call(browserHistory.push('/chat')) 
     } 
    } catch (err){ 
     throw err 
     }  
} 

export function* signIn(action) { console.log("hi") 
    yield put(requestSignIn()) 
    try { 

     const response = yield call(fetch,'/api/sign_in', { 
       method:'POST', 
       headers:{'Accept': 'application/json', 'Content-Type': 'application/json'}, 
       body: JSON.stringify(action.payload) /////action.payload contains {username:'aa',password:'aa'} 
       }) 


     if(response.ok){ 
      yield call(cookie.save,'username',action.payload.username) 
      yield put(receiveSignIn(action.payload)) 
      yield call(browserHistory.push('/chat')) 
     } 
    } catch (err){ 
     throw err 
     } 
} 

私は私がコールする第二引数に置くことが予想と思うが、私はyield call(browserHistory.push('/chat'),null)すなわちヌルコード化されたとき、私はまだエラー

uncaught at signIn call: argument fn is undefined 
uncaught at check call: argument fn is undefined 

を取得また、私のreceiveAuthがこのメッセージを返しています:

uncaught at rootSaga 
at rootSaga 
at receiveAuth 
Error: Actions must be plain objects. Use custom middleware for async actions. 
+0

(コンテキストが第1引数として提供されている)thisコンテキストでメソッドを呼び出すことができますapply Effectを使用していますか?それは例外がスローされている場所のようです。 –

答えて

11

signInサガの中にあるyield call(somefunc, ...)からのエラーです。それはsomeFunc(それがあなたのコードにあるどんな名前でも)は定義されていないと言います。あなたは、関数名をmispelledまたは多分その定義モジュールからエクスポートするために省略したhaventのであれば、あなたは確認する必要があり

私はあなたがこの

yield call(browserHistory.push('/chat'),null) 
ようbrowserHistory.push関数を呼び出すことに気づい

EDIT

自分自身で関数を呼び出すのではなく、関数自体と引数(そして最終的にはこのコンテキスト)をサガに渡すべきです

yield apply(browserHistory, browserHistory.push, ['/chat']) 

私はあなたがサインイン佐賀のコードを投稿することができ

+0

問題を引き起こしている可能性のあるコールが2つあります。追加した追加情報をご覧ください。どのように修正するべきか教えてください。 – mtangula

+0

完璧に動作します、ありがとう!私はあなたがナルトのファンであることを参照してください – mtangula

+0

ああYeeeeeeeees! –

関連する問題