如何调度,接下来,以及中间件的工作顺序如何工作?

时间:2016-09-16 04:30:54

标签: javascript redux middleware react-redux

我正在学习中间件并希望确认一些东西。如果我有以下中间件设置:

调度 - > thunk - >承诺中间件 - >交通中间件 - >减速器

我想澄清一些其他的事情。如果我对以下内容的理解不正确,请告诉我:

  1. 如果我发送任何其他功能或承诺,该动作将直接转到减速器。

  2. 如果我发送一个函数,它将通过thunk,并且在该函数之外,如果我接下来调用它,它将通过promise中间件。

  3. 如果我发送一个函数,它将通过thunk,并且在该函数之外,如果我发送另一个函数,它将再次通过thunk,或者如果我发送一个promise,它将通过promise中间件。< / LI>
  4. 如果我在交通中间件中,则调用next会将操作带到reducer,或者如果我调用dispatch并且该操作既不是函数也不是promise,它也会直接转到reducer。
  5. 如果在thunk,承诺中间件或流量中间件,我不使用dispatch或next,那么返回的对象被切断,循环停在那里,数据将不再通过任何中间件链,也不会通过减速器。
  6. my middlewares.js

    import * as actions from '../actions/actionCreators'
    import { formatPokemonData, formatDescription, formatPokeType } from '../helpers/helpers'
    import fetch from 'isomorphic-fetch'
    
    export const promiseErrorMiddleware = store => next => action => {
      if (!action.promise) {
        return next(action)
      }
      const url = action.url
      const fetchName = action.fetchName
      return Promise.resolve(fetch(url)).then((response) => {
        if (response.status === 404) {
          store.dispatch({type: 'SPELLING_ERROR'})
          throw new Error("Please ensure Pokemon name is spelled correctly")
        } else if (response.status >= 400) {
          store.dispatch({type: 'SERVER_ERROR'})
          throw new Error("Server Error")
        }
        return response.json()
      }).then((data) => {
        next({data: data, needDirection: true, fetchName: fetchName })
      })
    }
    
    export const dataTrafficMiddleware = store => next => action => {
      if (!action.needDirection) {
        return next(action)
      }
      const data = action.data
      const fetchName = action.fetchName
      if (fetchName === 'fetchPokemon') {
        next(actions.receivePokemon(formatPokemonData(data)))
        store.dispatch(actions.fetchPokemonDescription(data.name))
      } else if (fetchName === 'fetchPokemonDescription') {
        store.dispatch(actions.receivePokemonDescription(formatDescription(data)))
        store.dispatch(actions.addActivePokemon(store.getState().pokemonArray.filter((p) => (
          p.name === data.name
        ))[0]))
        store.dispatch(actions.checkPokeTypeCache(store.getState().activePokemon.pokeType))
      } else if (fetchName === 'mainTypeFetch') {
        store.dispatch(actions.receivePokeType(formatPokeType(data)))
        store.dispatch(actions.addActivePokeType(formatPokeType(data)))
      } else if (fetchName === 'subTypeFetch') {
        store.dispatch(actions.receivePokeType(formatPokeType(data)))
        store.dispatch(actions.addActiveSubPokeType(formatPokeType(data)))
      }
    }
    

1 个答案:

答案 0 :(得分:2)

  
      
  1. 如果我发送任何其他函数或承诺,该动作将直接转到reducer。
  2.   
  3. 如果我发送一个函数,它将通过thunk,并且在该函数之外,如果我接下来调用它,它将通过promise中间件。
  4.   

这两点是正确的。

  
      
  1. 如果我发送一个函数,它将通过thunk,并且在该函数之外,如果我发送另一个函数,它将再次通过thunk
  2.   

redux-thunk在函数中注入dispatch,它从链的开头再次启动进程。因此,如果您将函数发送给它,它将再次由thunk处理。

  
      
  1. 如果我在交通中间件中,则调用next会将操作带到reducer,或者如果我调用dispatch并且该操作既不是函数也不是promise,它也会直接转到reducer。
  2.   

很难回答你的问题,因为我不知道你的流量中间件实现

  
      
  1. 如果在thunk,承诺中间件或流量中间件,我不使用dispatch或next,那么返回的对象被切断,循环停在那里,数据将不再通过任何中间件链,也不会通过减速器。
  2.   

是的,如果您不打电话给next,链中的其他中间件将无法获得您的操作,并且不会产生任何影响。