繁体   English   中英

使用thunk:为什么我的代码没有按顺序打印?

[英]Using thunks: Why isn't my code printing sequentially?

我正试图了解那些笨蛋。 我正在通过Lynda上的Kyle Simpson的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。

为什么我的期望不正确?

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一个再次,因此执行两次第一功能。


要解决此问题,您可能需要通过推送到一个不变的concat中来更改修改:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM