当前位置:首页 > JavaScript

js实现applyMiddleWare

2026-02-02 00:50:00JavaScript

applyMiddleware 的实现原理

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

基本实现思路

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

中间件结构示例

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

js实现applyMiddleWare

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实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…

js实现代码雨

js实现代码雨

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

js实现的游戏

js实现的游戏

JavaScript 游戏开发基础 JavaScript 是开发网页游戏的流行选择,因其无需插件即可在浏览器中运行。以下是一些关键技术和资源: HTML5 Canvas Canvas 提供了绘制图形…