2016-06-22 2 views
1

Давайте притворимся, что у меня есть многолетняя функция, работающая над вычислением моего нового состояния.«Безопасность резьбы» в Редуксе?

Между тем еще одно действие происходит и изменяет состояние, в то время как первый не закончил и работает над материалом.

Если я правильно представляю вещи, нет очереди действий, и состояние может быть разрешено каким-то непредсказуемым образом.

Должен ли я беспокоиться об этом вообще?

Я не имею в виду настоящие темы, просто концепцию отсутствия лучшей формулировки. Действия являются асинхронными, а к ключам состояния обращаются по ссылке.

+0

В вашем браузере имеется только один поток для вашего javascript. Поэтому ваше длинное вычисление закончится первым, затем начнется второе. Кстати, вы должны избегать длинных вычислений, так как это заставит браузер замораживать (помните, что у вас есть только один поток для всего, пользовательский интерфейс и вычисления). – Pierrickouw

+0

Это не настоящие темы, просто из-за отсутствия лучшей формулировки. Действия являются асинхронными, а к ключам состояния обращаются по ссылке. – firedev

ответ

0

Это ответственность ваших собственных создателей действий и ваших собственных редукторов и в значительной степени связана с тем, как вы концептуально структурируете свои действия и редукторы. Вопрос FAQ по Redux по структурированию «бизнес-логики» здесь очень важен: http://redux.js.org/docs/FAQ.html#structure-business-logic.

создатели

действий Thunk имеют доступ к 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, я добавил плагин, чтобы исправить это, но, похоже, отсутствует текущая загрузка документов. Если вы перейдете по этой ссылке, а затем нажмите Enter в строке URL после загрузки страницы, она должна перейти прямо к правильному вопросу. Вы также можете найти ссылку на вопрос «Бизнес-логика» в Оглавлении в верхней части страницы часто задаваемых вопросов. Я посмотрю, смогу ли я исправить поведение страницы позже. – markerikson

0

Меня беспокоило одно и то же, поэтому я просто сделал рытье. Похоже, что два потока одновременно вызывали dispatch() (если это было возможно) could raise an exception. Но это не должно быть возможным, и это сообщение об ошибке указывает на конкретную, другую причину. «Очередь действий» находится в собственном цикле событий браузера. В этом цикле событий выполняются обратные вызовы async/взаимодействия (из которых мы вызываем dispatch()) один раз в то время.

Смежные вопросы