我知道两者都是返回函数的函数。
到目前为止,我使用thunk的经验一直是使用它们返回函数而不仅仅是动作对象,这样我才能在Redux
中处理异步请求。
闭包是一个高阶函数(HOF)的实现,以便为私有变量创建一个新的范围......对吗? HOF的其他示例包括map
,reduce
和filter
。
还有其他什么东西明确定义了两者之间的差异吗?
感谢。
答案 0 :(得分:7)
我知道两者都是返回函数的函数
您的理解有点不正确
到目前为止,我使用thunk的经验一直在使用它们来返回函数而不仅仅是动作对象,这样我就可以在Redux中处理异步请求了。
Thunks(和高阶函数,就此而言)与任何特定库(React,Redux)或任何特定控制流(sync,async)本质上没有关系。 thunk只是一个nullary函数 - 它们有各种常见用例,但最常用于延迟特定计算的评估。
闭包是一个高阶函数(HOF)的实现,以便为私有变量创建一个新的范围......对吗? HOF的其他示例包括map,reduce和filter。
closure不一定是高阶函数的实现。 function
关键字(和=>
箭头函数语法)确实创建了一个具有新(词法)范围的闭包,是的。
还有其他什么东西明确定义了两者之间的差异吗?
是。它们是如何相同的:
它们的区别如何:
也许是最关键的区别:
答案 1 :(得分:6)
Thunks是函数换行表达式,以便延迟评估。
这个延迟是在Redux thunk a中实现的,当一个动作被调用它返回一个函数。然后可以在以后调用返回的此函数。
这是一个thunk动作的例子。
function incrementAsync() {
// the below function is called by Redux Thunk middleware below.
return dispatch => {
setTimeout(() => {
// Yay! Can invoke sync or async actions with `dispatch`
dispatch(increment());
}, 1000);
};
高阶函数只是一个返回函数或将函数作为其参数之一的函数。因为这个函数返回另一个将dispatch作为参数的函数,所以这是一个高阶函数的例子。
redux thunk中间件的代码类似于
function createThunkMiddleware() {
return store => next => action => {
if (typeof action === 'function') {
// since action is a function it is a thunk action creator
// so call it with store methods
return action(store.dispatch, store.getState);
}
// action is not a function so redux thunk ignores it
return next(action);
};
}
一旦我们的thunk动作创建者被调用,它就会通过中间件链发送动作功能。当它到达我们的thunk中间件时,此操作被识别为函数,因此使用商店的dispatch和getState方法再次调用。
由于第二个函数调用,我们现在处于thunk action creator返回函数的范围内。这意味着我们现在可以执行异步逻辑,并且仍然可以访问商店的getState和dispatch方法。这就是为什么我们的thunk动作创建者可以被认为是thunk表达式。通过使用更高阶函数,我们可以访问,但推迟使用商店的dispatch或getState方法到将来的时间。如下所示,增量操作在一秒延迟后调用。
function incrementAsync() {
// the below function is called by Redux Thunk middleware below.
return dispatch => {
setTimeout(() => {
// Yay! Can invoke sync or async actions with `dispatch`
dispatch(increment());
}, 1000);
};