a = ["1","2","3"]
square = (i,cb)->
i = parseInt(i)
setTimeout ()->cb null,i*i,100
for i in a
square i,(err,result)->
console.log i + " " + result
output:
3 1
3 4
3 9
expected:
1 1
2 4
3 9
如果删除setTimeout,我可以得到预期的结果。
或写得像这样
for i in a
((i)->
square i,(err,result)->
console.log i + " " + result
)(i)
这是一个javascript错误吗?
答案 0 :(得分:0)
以下是实际javascript中的相同代码,它产生相同的结果(并且小提琴:http://jsfiddle.net/99obrntp/)
/videos/:id
现在平方结果显然是正确的,但问题是你对var a = ['1','2','3'];
function square(i, cb){
i = parseInt(i);
setTimeout(function(){
cb(null, i*i);
}, 100);
}
for(var i=0; i<a.length; i++){
var value = a[i];
square(value, function(err, result){
console.log(value, result);
});
}
的调用。原因是在循环完成之前第一次不会调用回调(因为console.log()
)。换句话说,setTimeout
在第一次写入控制台之前变为value
。要解决此问题,您需要将值传递给回调。例如:
3