2016-06-22 21 views
1

私は新しい状態のコンピューティングに長時間働く機能を持っているようです。Reduxの「スレッドの安全性」?

一方、別のアクションが開始され、最初のアクションが完了せずに作業をしている間に、状態が変更されます。

私が物事を正しく想像している場合、アクションキューは存在せず、状態は予測不可能な方法で解決される可能性があります。

私はこれについて全く心配すべきですか?

私は実際のスレッドを意味するものではなく、より良い言葉遣いの欠如の概念です。アクションは非同期であり、状態キーは参照によってアクセスされています。

+0

ブラウザでは、JavaScriptは1つのスレッドしかありません。したがって、長い計算が最初に終了し、次に2番目の計算が開始されます。 Btwでは、ブラウザをフリーズさせるので、長い計算を避けるべきです(覚えておいてください、すべてのUIと計算には1つのスレッドしかありません)。 – Pierrickouw

+0

より良い言葉遣いの欠如のために、本当のスレッドではありません。アクションは非同期であり、状態キーは参照によってアクセスされています。 – firedev

答えて

0

これは、あなた自身のアクションクリエイターと自分のレデューサーの責任であり、あなたのアクションとレデューサーの構想を概念的にどのように構成するかに大きく関係します。 "ビジネスロジック"の構築に関するRedux FAQの質問は、ここでは非常に関連しています:http://redux.js.org/docs/FAQ.html#structure-business-logic

サンクアクションの作成者はgetStateへのアクセス権を持っているので、サンクは、現在の状態をチェックし、のみなど、この例のように、一定の条件の下で派遣持っていることは非常に一般的です:

// An example of conditional dispatching based on state 
const MAX_TODOS = 5; 

function addTodosIfAllowed(todoText) { 
    return (dispatch, getState) => { 
     const state = getState(); 

     if(state.todos.length < MAX_TODOS) { 
      dispatch({type : "ADD_TODO", text : todoText}); 
     }  
    } 
} 

あなたの減速も持つことができる健全性チェック同様に:個人的に

function todosReducer(state, action) { 
    switch(action.type) { 
     case "ADD_TODO": { 
      if(state.todos.length >= state.maxTodos) { 
       return state; 
      } 

      return { 
       ...state, 
       todos : state.todos.concat(action.newTodo) 
      } 
     } 
     default : return state;   
    }  
} 

、私はただやみくもに、それは非常に小さいのですがない限り(のように、現在選択されているタブか何かの名前を言う)、行動にどのようなデータの中にマージ私のレデューサーを持って好きではありません。私は、アクションを作成するために自分のアクションクリエイターに合理的な量のロジックを持たせることを好みます。アクション自体に含まれる最小限のデータ量と、そのアクションに基づいて作業を行うための十分にスマートなレデューサーです。

+0

あなたがリンクしているFaqの一部が削除されました。更新されたセクションの関連セクションを教えてください。 – firedev

+0

質問を含め、FAQ全体がまだそこにあります。残念ながら、Gitbookソフトウェアには、読み込まれた後にページの先頭に戻ってしまうという問題があります。私がFAQを書いたとき、それを修正するためのプラグインを追加しましたが、ドキュメントの現在のアップロードにはそれがないようです。そのリンクに行き、ページがロードされた後にURLバーのEnterキーを押すと、正しい質問に直接ジャンプするはずです。また、「ビジネスロジック」の質問へのリンクは、FAQページの上部にある目次で見つけることができます。後でページの動作を修正できるかどうかがわかります。 – markerikson

0

私は同じことを心配していたので、ちょうど掘り下げました。可能であれば、dispatch()(可能であれば)を呼び出す2つのスレッドのように見えます。could raise an exception。しかし、それは不可能であり、エラーメッセージは特定の異なる原因を指しています。 「アクションキュー」は、ブラウザ自身のイベントループ内にあります。このイベントループは、非同期/対話コールバック(これをdispatch()と呼ぶ)を1つずつ実行します。