2016-10-25 18 views
0

は、私は、データベースの変更にアクションを放出している2人のFirebaseリスナーを、持っています。それは上記の両方のリスナーによって検出される変更を行います。 この「他のアクション」は放出されると、私はエラーを取得しています:Reduxの複数のアクション

Reducers may not dispatch actions. 

なぜこの出来事はありますか?

アプリケーションは、pepperoni-app-kit redux-thunkの上に構築されます。

リスナーにタイムアウトを追加する場合は、dispatchとなりますが、問題なく動作しますが、これは解決策ではありません。

case constants.UPDATE_PROFILE: 
    return state.set('profile', fromJS(action.payload)) 
    break; 

case constants.SUBMIT_EVENT: { 
    const profile = state.get('profile').toJS(); 
    const eventId = action.payload; 
    fb.db.ref(`activeEvents/${profile.uid}/${eventId}`).set(true); 
    fb.db.ref(`profiles/${profile.uid}/totalEvents`).set(Number(profile.totalEvents) +1 || 1); 
    return state 
    break; 
} 

case constants.ACTIVE_EVENT: { 
    if (typeof action.payload === 'string') { 
    return state.deleteIn(['activeEvents', action.payload]) 
    } else { 
    return state.setIn(['activeEvents', action.payload.id], action.payload) 
    } 
} 

アクション:

SUBMIT_EVENT // the one, which triggers changes in db 
UPDATE_PROFILE 
ACTIVE_EVENT 
+0

エラーが発生すると、関連するすべてのコードが含まれていなかったことが示唆されます。 'watchProfile'はアクション作成者ですか? (あなたは??あなたの還元剤としてwatchProfileを使用しようとした場合を除く)とエラーが減速について – WTK

+0

@WTKですが、私はコード – stkvtflw

+0

を追加しました私は減速にfirebase 'set'クエリを放射されてきたという理由だけで、このですか?私はそれを別の場所に移しました、そして今、それは動作します。しかし、私は、彼らがどのようにそれに影響を与えたのですか?クエリは、何らかのアクションや、還元に関連するものを放出していません。今のところアクションの間にもう少し時間があるので、今は動作しますか?この場合、バグはまれにしか起こらないでしょう。 – stkvtflw

答えて

0

ソースhttps://github.com/reactjs/redux/blob/55f1d08000b1b064eaa933bbbd132230e53bcccb/src/createStore.js#L165を見てみると、アクションを消費しながら、あなたが(fb.db.ref経由)を変更するので、あなたがこのエラーを持っていることと思われます。これは、おそらくあなたのfirebaseリスナーを起動し、新しいアクションをディスパッチさせます。

setTimeoutを使用する理由は、次のイベントループでもっとも早く起動するためです。これは、reduxに関しては、あるアクションの処理が完了しており、別のアクションを実行しても問題ないことを意味します。

constants.SUBMIT_EVENTイベントに反応し、fb.db.ref...で動作する独自のミドルウェア(http://redux.js.org/docs/advanced/Middleware.html#seven-examplesを参照)を作成している可能性があります。それは、減速機からアクションをディスパッチすることは禁じられていますが、ミドルウェアのコンテキストから行うのは大丈夫だから機能します。

ただ、円形の更新のために気を付ける - あなたはFirebaseでターン更新項目にあなたがトラブルになると思います「にonUpdate」アクションを起動しますFirebase内の項目を更新しておこう場合。

+0

'fb.db.ref ...'はファイヤーベースを修正する関数であり、アクションやその他何も出力しません。 Firebaseは、変更イベントを特定のアプリのアクションから頻繁に独立して放出します。それは、同じ瞬間に複数のアクションが作成されたときに、毎回アプリがクラッシュするということですか? – stkvtflw

+0

はい、確かですが、firebase上のイベントをリッスンするリスナーをバインドしており、そのリスナーがアクションをディスパッチしています。 それはそれが言うことを意味する:あなたはあなたのレデューサーから今起こる種類の新しい行動を送ることができません(アフリカ)。言い換えると、数十のアクションを派遣することは可能ですが、設計上、一度に1つしか処理できませんし、処理中に次のキューをキューに入れることはできません。 – WTK

関連する問題