javascript - 使用 thunk : Why isn't my code printing sequentially?

标签 javascript asynchronous thunk asynchronous-javascript

我正在尝试理解thunks。我正在学习 Kyle Simpson 在 Lynda 上开设的 Rethinking Async JS 类(class)。

我有这个代码:

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。

为什么我的期望不正确?

最佳答案

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又是one,因此第一个函数被执行了两次。

<小时/>

要解决此问题,您可能需要通过推送到非变异连接来更改修改:

return function(cb) {
    fn.apply(null, args.concat(cb));
}

关于javascript - 使用 thunk : Why isn't my code printing sequentially?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47227983/

相关文章:

android - 从异步服务更新 Activity

ios - sendAsynchronousRequest 使 UI 卡住

javascript - 将 co 库与 promises 一起使用而不是与 thunks 一起使用有什么好处?

c++ - 对虚拟 thunk 的 undefined reference

javascript - NodeJS + Android,Socket.io 聊天,应用程序在用户离开聊天室时崩溃

javascript - 随机数的增量值

JavaScript 对象定义属性和最大值

javascript - jQuery - 创建链接元素并单击它

javascript - Meteor Braintree -- 通过 Meteor 方法创建客户端 token