此评论中的惰性评估是什么意思?
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 和 Object
。 Redux-Thunk
中间件所做的是 检测 某个函数被 returned 代替。因此,它除了调用传递相同 dispatch
像往常一样。
现在回调负责调用 dispatch
以分派 SYNC 操作。
在我用于 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 和 Object
。 Redux-Thunk
中间件所做的是 检测 某个函数被 returned 代替。因此,它除了调用传递相同 dispatch
像往常一样。
现在回调负责调用 dispatch
以分派 SYNC 操作。