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

调度-> thunk-> Prom中间件->交通中间件-> Reducer

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


如果我分派了其他任何函数或诺言,则该操作将直接转到减速器。
如果我分派一个函数,它将通过thunk,然后离开那个函数,如果我接下来调用,它将通过promise中间件。
如果我调度一个函数,它将通过thunk,如果不调度该函数,如果我调度另一个函数,它将再次通过thunk,或者如果我调度一个promise,它将通过promise中间件。
如果我使用的是流量中间件,则调用next会将操作交给化简器,或者如果我调用了dispatch,而该操作既不是函数也不是promise,它也将直接转到化简器。
如果使用的是thunk,promise中间件或流量中间件,那么我不使用dispatch或next,则返回的对象将被切断,并且循环在那里停止,数据将不再通过任何中间件链,也不会经过reducer。


我的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)))
  }
}

最佳答案

如果我分派了其他任何函数或诺言,则该操作将直接转到减速器。
  如果我分派一个函数,它将通过thunk,然后离开那个函数,如果我接下来调用,它将通过promise中间件。
  


您在这两点上是正确的。


  
  如果我调度一个函数,它将通过thunk,而在该函数之外,如果我调度另一个函数,它将再次通过thunk
  


redux-thunk在函数中注入dispatch,该函数从链的开头再次开始处理。因此,如果您要分配一个函数,它将由thunk再次处理。


  
  如果我使用的是流量中间件,则调用next会将操作交给化简器,或者如果我调用了dispatch,而该操作既不是函数也不是promise,它也将直接转到化简器。
  


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


  
  如果使用的是thunk,promise中间件或流量中间件,那么我不使用dispatch或next,则返回的对象将被切断,并且循环在那里停止,数据将不再通过任何中间件链,也不会经过reducer。
  


是的,如果您不调用next,则链中的其他中间件将无法执行操作,也不会产生任何影响。

关于javascript - 在React Redux中,中间件的调度,下一步和排序如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39523769/

10-15 15:05