2017-01-19 3 views
0

Я взял это прямо из документации Redux:Redux middleware, thunks?

const logger = store => next => action => { 
    console.group(action.type) 
    console.info('dispatching', action) 
    let result = next(action) 
    console.log('next state', store.getState()) 
    console.groupEnd(action.type) 
    return result 
} 

Теперь я знаю, как использовать обещание, но санки ... Я немного потерял.

Почему они выполняют следующие функции: store => next => action =>?

ответ

4

В документации Redux о middleware, вы можете увидеть, что ES6 стрелка функции цепи:

logger = store => next => action => 

выглядит следующим образом при переводе на ES5:

function logger(store) { // this is not the store, just an object with getState and dispatch 
    return function wrapDispatchToAddLogging(next) { 
    return function dispatchAndLog(action) { 
     console.log('dispatching', action) 
     let result = next(action) 
     console.log('next state', store.getState()) 
     return result 
    } 
    } 
} 

Почему нам нужна функция что возвращает функцию:

Это называется частичным приложением, и вы можете узнать больше о это в этом article.

Основная идея состоит в том, что если вам нужно предоставить 3 аргумента для функции, но у вас есть только 1 из них сейчас, 1 позже, а третий будет в далеком будущем, вы можете применить аргументы по когда они доступны, а не сразу. Каждый раз, когда вы применяете аргумент, вы получаете новую функцию, которая имеет параметр «хранится» в его контексте.

В Redux

Промежуточное необходимо частичное приложение, потому что есть несколько шагов в создании middleware's chain:

Примечание: это реальный «магазин», который передается 1 аргумент:

const middlewareAPI = { 
    getState: store.getState, 
    dispatch: (action) => dispatch(action) 
} 
  1. я Массив terate промежуточного программного обеспечения, в вызова каждой функции и поставить middlewareAPI каждой функции (store => парам):

    цепи = middlewares.map (промежуточного слоя => промежуточного слоя (middlewareAPI))

  2. составить массив промежуточное программное:

    диспетчерских = Compose (... цепь) (store.dispatch)

  3. и compose проходит каждый промежуточное программное обеспечение в качестве параметра один перед этим next => и передать dispatch до последнего:

    возвращение funcs.reduce ((а, б) => (... арг) => а (Ь (... арг)))

  4. Теперь промежуточного программного простая функция только один параметр action =>, и всякий раз, когда действие перемещается по цепочке промежуточного программного обеспечения, функция action => каждого промежуточного программного обеспечения вызывается с текущим действием.

+0

Отлично! Вы многое прояснили! –

+0

Добро пожаловать :) –

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