异步回调中的javascript变量已更改

时间:2015-12-10 05:19:14

标签: javascript

  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错误吗?

1 个答案:

答案 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

更新小提琴:http://jsfiddle.net/3sdjgzv1/