Почему каждое промежуточное ПО Redux может вызывать следующее (действие), не будет ли оно отправлять одно действие несколько раз? - PullRequest
0 голосов
/ 03 мая 2019

Я читал официальные учебные пособия о промежуточном программном обеспечении.

Я запутался в этой строке кода промежуточного программного обеспечения: next(action)

Насколько я понимаю, nextфункция на самом деле store.dispatch, и каждое промежуточное ПО будет вызывать next(action), не будет ли оно отправлять это действие несколько раз?

Итак, есть два промежуточных ПО:

const logger = store => next => action => {
  console.log('dispatching', action)
  let result = next(action) // I'm talking about this line
  console.log('next state', store.getState())
  return result
}

const crashReporter = store => next => action => {
  try {
    return next(action) // This line too.
  } catch (err) {
    console.error('Caught an exception!', err)
    Raven.captureException(err, {
      extra: {
        action,
        state: store.getState()
      }
    })
    throw err
  }
}

Строка 3 и10 оба звонят next(action), плюс у меня самый первый store.dispatch(action), разве это действие не будет отправлено 3 раза?

Разве это не сломает приложение?

1 Ответ

1 голос
/ 03 мая 2019

Исходный код applyMiddleware означает, что dispatch изменяется следующим образом:

const fakeStore = {
  getState: store.getState,
  dispatch: (...args) => dispatch(...args)
}
const chain = middlewares.map(middleware => middleware(fakeStore))
dispatch = compose(...chain)(store.dispatch)

, где compose - это просто композиция функций.

Так что, если вы позвоните applyMiddleware(logger, crashReporter), то аргумент next вашего промежуточного ПО logger будет просто crashReporter(fakeStore), а не dispatch.

В общем, next будет следующим промежуточным программным обеспечением (отсюда и название).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...