简单来说,thunk和高阶函数之间的区别是什么?

时间:2017-07-17 13:10:14

标签: javascript redux functional-programming higher-order-functions thunk

我知道两者都是返回函数的函数。

到目前为止,我使用thunk的经验一直是使用它们返回函数而不仅仅是动作对象,这样我才能在Redux中处理异步请求。

闭包是一个高阶函数(HOF)的实现,以便为私有变量创建一个新的范围......对吗? HOF的其他示例包括mapreducefilter

还有其他什么东西明确定义了两者之间的差异吗?

感谢。

2 个答案:

答案 0 :(得分:7)

  

我知道两者都是返回函数的函数

您的理解有点不正确

  • Thunks可以返回任何类型的值 - 而不仅仅是函数类型
  • Higher-order functions可以返回任何类型的值 - 而不仅仅是函数类型
  

到目前为止,我使用thunk的经验一直在使用它们来返回函数而不仅仅是动作对象,这样我就可以在Redux中处理异步请求了。

Thunks(和高阶函数,就此而言)与任何特定库(React,Redux)或任何特定控制流(sync,async)本质上没有关系。 thunk只是一个nullary函数 - 它们有各种常见用例,但最常用于延迟特定计算的评估。

  

闭包是一个高阶函数(HOF)的实现,以便为私有变量创建一个新的范围......对吗? HOF的其他示例包括map,reduce和filter。

closure不一定是高阶函数的实现。 function关键字(和=>箭头函数语法)确实创建了一个具有新(词法)范围的闭包,是的。

  

还有其他什么东西明确定义了两者之间的差异吗?

是。它们是如何相同的:

  • 他们都是职能
  • 他们都可以返回任何类型的值

它们的区别如何:

  • thunks是nullary函数(它们不接受任何参数)
  • 高阶函数接受函数作为参数和/或返回函数

也许是最关键的区别:

  • 如果thunk只返回函数,则 只能被视为高阶函数。

答案 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);
  };