2

我们为什么要做这个:

const middleware = store => next => action => { ... }

而不是更简单的东西

const middleware = (store, next, action) => { ... }

Redux 团队以这种方式设计中间件有什么优势吗?如果我们拆分中间件功能,我们可以利用一些功能吗?

在我自己的应用程序中,我定义了一个simplerMiddleware()可以从第二种形式转换为第一种形式的函数,它似乎运行良好。

function simpleMiddleware(simpleMiddlewareFunction) {
  return store => next => action => simpleMiddlewareFunction(store, next, action);
}

为什么是三个箭头函数?

注意:我不是在问什么是柯里化,或者为什么在函数式编程中存在柯里化,或者柯里化的一般好处是什么;Redux 设计者选择这个签名而不是更简单的三参数函数有什么特别的原因吗?

4

1 回答 1

2

这在Redux 常见问题解答条目“为什么中间件签名使用柯里化?”中有专门解决。

Redux 中间件是使用看起来像 的三重嵌套函数结构编写的const middleware = storeAPI => next => action => {},而不是看起来像const middleware = (storeAPI, next, action) => {}. 这有几个原因。

一是“currying”函数是一种标准的函数式编程技术,Redux 明确地打算在其设计中使用函数式编程原则。另一个是柯里化函数创建了闭包,您可以在其中声明在中间件的生命周期内存在的变量(这可以被认为与在类实例的生命周期内存在的实例变量的功能等效)。最后,它只是最初设计 Redux 时选择的方法。

有些人认为声明中间件的柯里化函数签名是不必要的,因为在执行 applyMiddleware 函数时 store 和 next 都可用。这个问题已被确定为不值得引入重大更改,因为现在 Redux 生态系统中有数百个中间件依赖于现有的中间件定义。

于 2020-06-25T15:34:06.613 回答