当前位置:首页 > JavaScript

js实现applyMiddleWare

2026-02-02 00:50:00JavaScript

js实现applyMiddleWare

applyMiddleware 的实现原理

applyMiddleware 是 Redux 中的一个核心函数,用于将中间件应用到 store 的 dispatch 方法上。中间件可以在 action 被 dispatch 之前或之后执行自定义逻辑。

js实现applyMiddleWare

基本实现思路

  1. 接收多个中间件作为参数
  2. 返回一个 store enhancer 函数
  3. 在 enhancer 中创建 store 并增强 dispatch 方法
  4. 通过中间件链式调用实现功能组合

代码实现示例

function applyMiddleware(...middlewares) {
  return (createStore) => (reducer, preloadedState) => {
    const store = createStore(reducer, preloadedState)
    let dispatch = () => {
      throw new Error(
        'Dispatching while constructing your middleware is not allowed.'
      )
    }

    const middlewareAPI = {
      getState: store.getState,
      dispatch: (action, ...args) => dispatch(action, ...args)
    }

    const chain = middlewares.map(middleware => middleware(middlewareAPI))
    dispatch = compose(...chain)(store.dispatch)

    return {
      ...store,
      dispatch
    }
  }
}

compose 函数实现

function compose(...funcs) {
  if (funcs.length === 0) {
    return (arg) => arg
  }

  if (funcs.length === 1) {
    return funcs[0]
  }

  return funcs.reduce((a, b) => (...args) => a(b(...args)))
}

中间件结构示例

一个典型的中间件结构如下:

const middleware = (store) => (next) => (action) => {
  // 在 action 被 dispatch 前执行的逻辑
  const result = next(action)
  // 在 action 被 dispatch 后执行的逻辑
  return result
}

使用示例

import { createStore, applyMiddleware } from 'redux'
import logger from 'redux-logger'
import thunk from 'redux-thunk'

const store = createStore(
  rootReducer,
  applyMiddleware(thunk, logger)
)

关键点说明

  • 中间件接收 store API 作为参数,返回一个函数
  • 返回的函数接收 next 参数(下一个中间件或原始 dispatch)
  • 最终返回一个接收 action 的函数
  • 中间件可以修改、延迟、忽略或停止 action 的传递
  • compose 函数将多个中间件组合成单一函数调用链

错误处理

实现时需要注意错误处理,特别是在中间件构造期间避免 dispatch 调用,防止无限循环或其他意外行为。

分享给朋友:

相关文章

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js实现代码雨

js实现代码雨

实现代码雨效果 使用HTML5 Canvas和JavaScript可以轻松实现经典的代码雨效果。以下是完整的实现代码和说明: HTML结构 <!DOCTYPE html> <htm…

js实现 功能

js实现 功能

在 JavaScript 中实现功能通常涉及多个关键步骤,具体取决于功能需求。以下是常见功能的实现方法和示例: 基本功能实现 使用函数封装逻辑是最直接的方式。例如,实现一个计算两数之和的函数: f…

实现继承js

实现继承js

实现继承的方式 在JavaScript中,实现继承可以通过多种方式完成,每种方式都有其优缺点。以下是几种常见的实现继承的方法: 原型链继承 原型链继承是最基本的继承方式,通过将子类的原型指向父类的实…

js 实现全屏

js 实现全屏

使用 requestFullscreen 方法 通过调用元素的 requestFullscreen 方法可以实现全屏。该方法兼容现代浏览器,但不同浏览器可能需要前缀。 const element =…