JavaScript 变量在异步回调中更改
javascript variable changed in async callback
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
如果删除设置超时,我可以得到预期的结果。
或者这样写
for i in a
((i)->
square i,(err,result)->
console.log i + " " + result
)(i)
这是一个JavaScript错误吗?
这是实际 javascript 中的相同代码,产生相同的结果(和小提琴:http://jsfiddle.net/99obrntp/(
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
。要解决此问题,您需要将值传递给回调。例如:
var a = ['1','2','3'];
function square(i, cb){
i = parseInt(i);
setTimeout(function(){
cb(null, i*i, i);
}, 100);
}
for(var i=0; i<a.length; i++){
var value = a[i];
square(value, function(err, result, initial){
console.log(initial, result);
});
}
更新小提琴:http://jsfiddle.net/3sdjgzv1/
相关文章:
- Meteor:异步回调问题
- Meteor:异步函数回调异常:onAfterAction
- 异步中的回调函数出现问题'张贴'
- JavaScript中的异步回调
- 如何将此异步回调转换为生成器
- 在Nodejs中堆叠异步回调事件的最佳方式
- 如何使用jQuery等待来自回调的异步调用
- 从异步回调中获取值
- jasmine 2-在jasmine指定的超时时间内未调用异步回调.DEFAULT_TIMEOUT_INTERVAL
- 将数据注入异步回调(使用 node.js)
- 由于异步回调,变量被覆盖
- 与 promise 一起使用时,异步瀑布不执行下一个回调方法
- 如何将状态对象/数据传递给(异步)ajax 回调
- 管理Meteor中的异步回调
- 如何通过一个回调异步排队和执行多个promise
- 如何等到异步回调完成后才能使用检索到的数据
- 如何在node.js中通过API回调异步递归
- 将数据传递给node.js回调——异步问题
- 从回调(异步方法)内部访问对象文字属性
- 使 JavaScript 函数与回调异步