当前位置:首页 > JavaScript

js实现applyMiddleWare

2026-02-02 00:50:00JavaScript

js实现applyMiddleWare

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

中间件结构示例

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

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实现applyMiddleWare

分享给朋友:

相关文章

js 实现vue

js 实现vue

实现 Vue 的核心功能 在 JavaScript 中实现 Vue 的核心功能需要模拟数据绑定、虚拟 DOM 和响应式系统。以下是一个简化版的实现思路: 响应式系统 通过 Object.define…

js实现验证码

js实现验证码

实现验证码的JavaScript方法 生成随机验证码 使用Math.random()生成随机字符串,结合数字和字母: function generateCaptcha() { const cha…

js实现验证码

js实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas i…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="sli…