我正在尝试理解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/