代码之家  ›  专栏  ›  技术社区  ›  Michael Jones

在这个评论中,懒惰评估的含义是什么?

  •  18
  • Michael Jones  · 技术社区  · 8 年前

    在我用于React Redux项目的Boilerplate中,我在代码中遇到了以下注释:

    用于惰性评估的函数。它对于创建 异步操作,尤其是与redux-thunk结合使用时!

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

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

    2 回复  |  直到 4 年前
        1
  •  32
  •   Sean Vieira    8 年前

    // Not lazy
    var value = 1 + 1  // immediately evaluates to 2
    
    // Lazy
    var lazyValue = () => 1 + 1  // Evaluates to 2 when lazyValue is *invoked*
    

    返回值

    // 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.
    

    现在砰砰一声就不行了 要获取零参数,可以返回一个惰性值,该值需要更多参数才能成功求值。这被称为“咖喱”:

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

    dispatch 作用然后,您可以延迟地同步或异步生成一个或多个操作。大多数时候,您会希望使用它来允许异步分派。

    另请参见:

        2
  •  1
  •   Andre Pena    8 年前

    通常,Redux动作创建者是同步的,这意味着当您调用它们时,您会希望它们返回一个action,并立即调用Reducer,状态会动态变化。您还希望这个进程非常快,因为只会执行一个小的CPU限制操作。

    然而,有时您希望操作创建者转到服务器,或执行一些非CPU限制的操作,这需要一些时间。这时,返回函数才有意义。

    当动作创建者返回函数时, 它会立即返回 从谁呼叫动作创造者的角度来看,没有发生什么奇怪的事情。一切如常。但在内部,您的动作创建者并没有返回Action对象,而是返回了如下函数。。

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

    正常地 DoSomethingAsync 将返回一个 Object .什么是 Redux-Thunk 中间件的作用是 以检测 而是返回了一个函数。。因此,它只调用传递相同值的函数 dispatch 像往常一样。

    现在是回调的响应性 派遣