【问题标题】:Redux Middleware Infinite loop?Redux 中间件无限循环?
【发布时间】:2018-04-12 04:49:19
【问题描述】:

在下面代码的 sn-p 中,我很难理解 result = next(action) 如何最终不会成为无限循环。由于“最后一个函数”action => 采用参数 action 并根据采用 next 参数 (next => action =>) 的函数计算 result 值,然后调用采用 action 参数的函数 ( next => action =>) 再次。

基本上这段代码的递归性很难理解。

import C from '../constants'
import appReducer from './reducers'
import { createStore, applyMiddleware } from 'redux'

const consoleMessages = store => next => action => {

    let result

    console.groupCollapsed(`dispatching action => ${action.type}`)
    console.log('ski days', store.getState().allSkiDays.length)
    result = next(action)

    let { allSkiDays, goal, errors, resortNames } = store.getState()

    console.log(`

        ski days: ${allSkiDays.length}
        goal: ${goal}
        fetching: ${resortNames.fetching}
        suggestions: ${resortNames.suggestions}
        errors: ${errors.length}

    `)

    console.groupEnd()

    return result

}

export default (initialState={}) => {
    return applyMiddleware(consoleMessages)(createStore)(appReducer, initialState)

【问题讨论】:

    标签: javascript redux react-redux


    【解决方案1】:

    next 不是您的 函数之一的名称,它是参数名称。

    调用next 不会调用action => {...} 函数。

    这里没有任何递归。

    重写代码可能会让你更清楚:

    function consoleMessages(store) {
      return function (next) {
        return function (action) {
          ...
          let result = next(action)
          ...
        }
      }
    }
    

    【讨论】:

    • 谢谢。所以当一个“动作”发生时,它就会触发整个事情。当你给它动作时,下一个“对象”在做什么?控制台消息是否试图显示正在发生的操作?
    • 是添加动作的原因 => {..} 函数是否具有执行异步函数的能力?由于您可能会争辩说“结果=下一个(动作)”可以在一个同时接受下一个和动作对象的函数中实现。不知道为什么最后一个函数是必要的。
    • "当你给它动作时,下一个'对象'会做什么?" next 是一个函数。我不知道它有什么作用。随意在applyMiddleware API 中查找。
    • "是添加动作的原因 => {..} 函数是否具有执行异步函数的能力?"我不完全明白你想在这里问什么。我认为您不理解的是 applyMiddleware 函数需要一个以某种方式运行的参数。这种行为的原因完全在于 applyMiddleware 函数,所以我的建议是如果你想了解它是如何工作的,你可以去查看源代码。
    猜你喜欢
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 2021-01-02
    相关资源
    最近更新 更多