将javascript参数从外部作用域传递给匿名回调函数

时间:2013-01-25 19:13:17

标签: javascript facebook asynchronous anonymous-function

考虑以下

function firstFunction() {
  for ( var i = 0; i < 10; i++) 
    FB.api(apiPath,function(response) {
      secondFunction(response,i);
  });
}

function secondFunction(response,num) {
  alert(num);
}

我希望第二个函数异步调用10次,每次在num中接收不同的数字。 相反,secondFunction被调用10次,并且在所有这些中,num是10。

有人可以向我解释为什么它没有像我期望的那样传递,以及我如何能够像我期望的那样修复它?

由于

2 个答案:

答案 0 :(得分:4)

在第一个for异步回调执行之前,您的同步i循环将FB.api一直递增到10。

像这样:

function firstFunction() {
  for ( var i = 0; i < 10; i++) {
    (function(i2) {
      FB.api(apiPath,function(response) {
        secondFunction(response, i2);
      });
    })(i);
  }
}

修复程序将异步函数调用放入其自己的函数中,以便i可以作为参数传入,在调用时捕获i的值,而不是异步时发生回调。

答案 1 :(得分:0)

这是因为第二个函数仅在服务器在异步调用上返回响应并且循环继续运行时调用,当服务器响应var I已经是10时。

要修复它,你需要能够将i变量传递给第一个api,然后将它传递给第二个所以你可以参考。

您可能必须重构该方法以使其循环10次