Javascript中懒惰评估的意义

Mic*_*nes 14 javascript redux redux-thunk

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

这是一个thunk,这意味着它是一个立即返回延迟评估函数的函数.它对于创建异步操作非常有用,特别是与redux-thunk结合使用时!

现在,如果我理解正确,懒惰评估是返回函数的过程.返回函数的目的是什么,以及如何创建异步操作?

,还是一个thunk只是一个功能?

Sea*_*ira 25

thunk是一个不带参数并返回某些东西的函数(或者做一些副作用).延迟评估是将表达式的评估推迟到以后的过程,这可以通过thunk来完成:

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

// Lazy
var lazyValue = () => 1 + 1  // Evaluates to 2 when lazyValue is *invoked*
Run Code Online (Sandbox Code Playgroud)

您还可以使返回值变为惰性:

// 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.
Run Code Online (Sandbox Code Playgroud)

最后,我们可以推迟一些异步操作:

// 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.
Run Code Online (Sandbox Code Playgroud)

现在,一个thunk不具备采取零个参数-你可以返回需要更多的参数,成功评价一个懒惰的值.这恰当地称为"currying":

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

redux-thunk允许您将函数而不是对象作为动作返回,并使用dispatch函数调用函数.然后,您可以同步或异步地懒洋洋地生成一个动作(或动作).大多数情况下,您可能希望使用它来允许您异步分派.

也可以看看:

  • _"不带参数"_在这种情况下不是真的......一个redux thunk接受`dispatch`,它允许延迟一个动作调度. (2认同)