Зачем использовать редукционный преобразователь?

Я не понимаю необходимости чего-то вроде redux-thunk. Насколько я понимаю, thunk - это функция, которая возвращает функцию. Обернутые выражения и использование промежуточного программного обеспечения, как мне кажется, делают больше, чтобы запутать то, что происходит. Взято из примера кода redux-thunk

import thunk from 'redux-thunk';

// Note: this API requires redux@>=3.1.0
const store = createStore(
  rootReducer,
  applyMiddleware(thunk)
);


// Meet thunks.
// A thunk is a function t hat returns a function.
// This is a thunk.

function makeASandwichWithSecretSauce(forPerson) {

  // Invert control!
  // Return a function that accepts `dispatch` so we can dispatch later.
  // Thunk middleware knows how to turn thunk async actions into actions.

  return function (dispatch) {
    return fetchSecretSauce().then(
      sauce => dispatch(makeASandwich(forPerson, sauce)),
      error => dispatch(apologize('The Sandwich Shop', forPerson, error))
    );
  };
}

// Thunk middleware lets me dispatch thunk async actions
// as if they were actions!

store.dispatch(
  makeASandwichWithSecretSauce('Me')
);

Приведенный выше код можно было бы написать гораздо более лаконичным и интуитивно понятным:

fetchSecretSauce().then(
  sauce => store.dispatch(makeASandwich('Me', sauce)),
  error => store.dispatch(apologize('The Sandwich Shop', forPerson, error))
)

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


person micahblu    schedule 04.05.2017    source источник
comment
Скажем, вам нужно сделать вызов API, вы можете написать преобразователь, который либо разрешает, либо отклоняет обещание и соответственно отправляет действие SUCCESS или FAIL, а внутри вашего компонента все, что вам нужно сделать, это loadMyThunk() - все отправленные действия абстрагируются. к thunk. У меня есть библиотека redux-entity, в которой используется такой шаблон: github. com/mikechabot/redux-entity/blob/master/src/thunk.js   -  person lux    schedule 04.05.2017


Ответы (1)


Redux Thunk учит Redux распознавать особые виды действий, которые на самом деле являются функциями.

Когда создатель действия возвращает функцию, эта функция будет выполняться промежуточным программным обеспечением Redux Thunk. Эта функция не обязательно должна быть чистой; таким образом, разрешено иметь побочные эффекты, включая выполнение асинхронных вызовов API. Функция также может отправлять действия.

Преобразователь можно использовать для задержки отправки действия или для отправки только при выполнении определенного условия.

Если промежуточное ПО Redux Thunk включено, каждый раз, когда вы пытаетесь отправить функцию вместо объекта действия, промежуточное ПО будет вызывать эту функцию с самим методом отправки в качестве первого аргумента.

А затем, поскольку мы «научили» Redux распознавать такие «специальные» создатели действий (мы называем их создателями переходных действий), теперь мы можем использовать их в любом месте, где мы использовали бы обычные создатели действий.

Проверьте этот отличный ответ от самого Дэна Абрамова, он охватывает все: https://stackoverflow.com/a/35415559/5714933

Также проверьте эти ссылки для получения дополнительной информации:

https://github.com/gaearon/redux-thunk#motivation http://redux.js.org/docs/advanced/AsyncActions.html

person Moe    schedule 04.05.2017
comment
Спасибо Мохамед. Я ценю усилия здесь. Проблема в том, что я уже прочитал этот пост Дэна Абрамова и остался неудовлетворенным. Прочитав все эти материалы, я понял, что преобразователь можно использовать для задержки отправки действия, но вы можете легко сделать это и без преобразователя, как я показал в своем примере выше. Другая причина, которую я обнаружил, заключается в том, что вы можете выполнять условную отправку на основе переданного getState, но вы также можете выполнить это без thunk и без добавления библиотеки промежуточного программного обеспечения и другого уровня зависимостей для изучения. Я не вижу, как это помогает и для более крупных приложений. - person micahblu; 04.05.2017
comment
@micahblu, я вижу, вы уже поняли идею redux-thunk, честно говоря, здесь не так много объяснений, которые можно было бы добавить. Идея проста, "задержка-отправка". И redux-redux, и redux-thunk реализованы плохо (с точки зрения дизайна). По сути, вы просто создаете объект, подписываетесь на его поток данных и сообщаете об этом реакции для повторного рендеринга. Обе библиотеки ужасно поставлены. Action Creator, Action, Dispatch, Reducer и, наконец, Store. Фу. Вполне выдуманная терминология. - person serkan; 25.02.2019
comment
@serkan Каковы ваши рекомендации по хорошо продуманным альтернативам? - person Liron Lavi; 24.03.2020