当前位置:首页 > JavaScript

js实现applyMiddleWare

2026-04-06 17:58:01JavaScript

实现中间件机制的基本思路

中间件机制的核心是创建一个函数链,每个中间件可以访问请求对象、响应对象以及下一个中间件函数。通过组合这些函数,实现对请求的层层处理。

function applyMiddleware(...middlewares) {
  return (createStore) => (reducer, preloadedState) => {
    const store = createStore(reducer, preloadedState)
    let dispatch = store.dispatch

    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函数负责将多个中间件函数组合成一个调用链。这个函数从右到左依次调用每个中间件,将前一个中间件的返回结果作为下一个中间件的参数。

js实现applyMiddleWare

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

中间件的编写规范

每个中间件应该遵循特定的格式,接收包含getStatedispatch方法的对象,返回一个接收next方法的函数,最后返回一个能处理action的函数。

const loggerMiddleware = ({ getState }) => next => action => {
  console.log('dispatching', action)
  let result = next(action)
  console.log('next state', getState())
  return result
}

使用示例

将多个中间件应用到Redux store的创建过程中,实现对dispatch功能的增强。

js实现applyMiddleWare

import { createStore } from 'redux'
import rootReducer from './reducers'

const store = createStore(
  rootReducer,
  applyMiddleware(loggerMiddleware, thunkMiddleware)
)

异步中间件的实现

处理异步action的中间件需要检查action类型,如果是函数则执行它,否则传递给下一个中间件。

const thunkMiddleware = ({ dispatch, getState }) => next => action => {
  if (typeof action === 'function') {
    return action(dispatch, getState)
  }
  return next(action)
}

错误处理中间件

可以在中间件链中添加错误处理逻辑,捕获并处理action处理过程中抛出的异常。

const errorHandlerMiddleware = ({ dispatch }) => next => action => {
  try {
    return next(action)
  } catch (err) {
    console.error('Caught an exception!', err)
    dispatch({ type: 'ERROR', error: err })
    throw err
  }
}

分享给朋友:

相关文章

js如何实现继承

js如何实现继承

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

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的J…

js计算器的实现

js计算器的实现

实现基础结构 HTML部分需要创建计算器的基本框架,包含显示区域和按钮。使用<div>容器包裹整个计算器,内部设置一个显示屏和多个按钮。 <div class="calculato…

js 实现全屏

js 实现全屏

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

js 实现mvc

js 实现mvc

MVC 模式简介 MVC(Model-View-Controller)是一种软件设计模式,将应用程序分为三个核心组件:模型(Model)处理数据和业务逻辑,视图(View)负责展示数据,控制器(Con…

js实现截图

js实现截图

使用HTML2Canvas库实现截图 HTML2Canvas是一个流行的JavaScript库,可以将网页元素或整个页面转换为Canvas图像。安装方式: npm install html2canv…