此评论中的惰性评估是什么意思?

What is the meaning of lazy evaluation in this comment?

在我用于 React Redux 项目的样板中,我在代码中看到了这条评论:

This is a thunk, meaning it is a function that immediately returns a function for lazy evaluation. It is incredibly useful for creating async actions, especially when combined with redux-thunk!

现在,如果我理解正确的话,惰性求值就是返回一个函数的过程。返回函数的目的是什么,这对创建异步操作有何好处?

哦还有,thunk 只是一个函数吗?

thunk 是一个不带参数并且 return 做某事(或作为副作用做某事)的函数。惰性求值是将表达式的求值推迟到以后的过程,这可以用 thunk 来完成:

// Not lazy
var value = 1 + 1  // immediately evaluates to 2

// Lazy
var lazyValue = () => 1 + 1  // Evaluates to 2 when lazyValue is *invoked*

你也可以让return值懒惰:

// Not lazy
var add = (x, y) => x + y
var result = add(1, 2)  // Immediately evaluates to 3

// Lazy
var addLazy = (x, y) => () => x + y;
var result = addLazy(1, 2)  // Returns a thunk which *when evaluated* results in 3.

我们终于可以推迟一些异步操作了:

// Not lazy
var callApi = spec => fetch(spec.url, spec.options);
// Immediately returns a Promise which will be fulfilled when the network response is processed.
var result = callApi({url: '/api', options: {}});

// Lazy
var callApiLazy = spec => () => fetch(spec.url, spec.options);
var result = callApiLazy({url: '/api', options: {}});
// result is a thunk that when evaluated will return a Promise ...
// which will be fulfilled when the network response is processed.

现在 thunk 没有 接受零参数 - 你可以 return 一个需要更多参数才能成功计算的惰性值。这被正确地称为 "currying":

// Curried add (not lazy)
var add = x => y => x + y
var add3 = add(3)
var result = add3(7)  // Immediately evaluates to 10

redux-thunk 允许您 return 函数,而不是对象,作为操作并使用 dispatch 函数调用您的函数。然后,您可以延迟地同步或异步地生成一个(或多个)动作。大多数时候,您会希望使用它来允许您异步调度。

另请参阅:

通常,Redux 动作创建者是同步的,这意味着,当您调用它们时,您会期望它们 return 立即调用一个动作和 Reducers,并动态更改状态。您还希望这个过程非常快,因为只会执行一个小的 CPU 绑定操作。

但是,有时您希望动作创建者转到服务器,或者执行一些需要一段时间的非 CPU 绑定操作。那时候 return 函数才有意义。

当您的操作创建器 return 是一个函数时,它 return 会立即 。从who calls the action creator的角度来看,并没有什么奇怪的事情发生。一切如常。但在内部,您的动作创建者没有 return 编辑 Action 对象,而是 return 编辑了一个像这样的函数..

function DoSomethingAsync() {
    return (dispatch) => {
        // go do something realllly slowly.
        // ok now get the RESULT and call a regular action
        dispatch(mySyncAction(RESULT));
    }
}

通常 DoSomethingAsync 会 return 和 ObjectRedux-Thunk 中间件所做的是 检测 某个函数被 returned 代替。因此,它除了调用传递相同 dispatch 像往常一样。

现在回调负责调用 dispatch 以分派 SYNC 操作。