0

我试图理解 thunks。我正在学习 Kyle Simpson 在 Lynda 上的 Rethinking Async JS 课程。

我有这个代码:

function makeThunk(fn) {
    var args = [].slice.call(arguments, 1);
    return function(cb) {
        args.push(cb);
        fn.apply(null, args);
    }
}

function addAsync(x,y, cb) {
    setTimeout(function() {
        cb(x+y);
    }, 1000);
}


var thunk = makeThunk(addAsync, 10,15);

现在,当我执行以下操作时:

thunk(function(sum) {
    console.log(sum * sum);
})

thunk(function(sum) {
    console.log(sum);
})

结果是 625 打印了两次。

但是,当我执行

thunk(function(sum) {
    console.log(sum);
})
thunk(function(sum) {
    console.log(sum * sum);
})

结果是 25 执行了两次。

在第一种情况下,我的期望是先打印 625,然后再打印 25。在第二种情况下,先打印 25,然后再打印 625。

为什么我的期望不正确?

4

1 回答 1

1
var thunk = makeThunk(addAsync, 10,15);

之后,封闭的 args 数组是:

[10, 15]

现在,如果您致电thunk

thunk(function one(sum) {
console.log(sum * sum);
})

内部参数是:

[10, 15, one]

并且该功能是第一次执行。然后你打电话:

thunk(function two(sum) {
  console.log(sum);
})

所以 args 看起来像这样:

[10, 15, one, two]

所以addAsync被称为:

addAsync(10, 15, one, two)

所以cb又是一个,因此第一个函数被执行了两次。


要解决此问题,您可能希望通过 push 更改修改为非变异连接:

return function(cb) {
    fn.apply(null, args.concat(cb));
}
于 2017-11-10T17:21:48.227 回答