【问题标题】:jQuery use closures in callback function to manipulate $getJSON datajQuery 在回调函数中使用闭包来操作 $getJSON 数据
【发布时间】:2013-01-18 14:58:01
【问题描述】:

这真的让我着迷:

for(var i=0; i<10; i++) {
   (function(x) {     //use a closure to hold the "i" value
       request(arg[x], function(n) {
          //do something with the data returned from $getJSON
          console.log(n);
       });
   })(i)  //is this syntax correct?
}

function request(argX, callback) {    //is this syntax correct?
     $getJSON(parameter) { 
         //get request result
         ... 
     }
     callback(); //after request() function is completed, trigger the callback function
                 //is this syntax right? 

}

我之所以使用回调函数是因为我想操作getJSON的结果,所以我需要等待请求函数完成。

我还需要将回调函数与循环索引“i”值绑定。

我已经玩了一段时间的语法,但是控制台日志为什么没有返回任何内容?在 $getJSON 完成之前,似乎从未执行或执行过回调函数。

我需要专家的帮助!

【问题讨论】:

  • "在 $getJSON 完成之前似乎从未执行或执行过回调函数。" - - 正确的。因为$.getJSON是异步的
  • request(arg[x], function(n) { 缺少右括号 ')' 否?

标签: jquery callback closures


【解决方案1】:

getJSON 调用是异步的,因此您将在响应到达之前调用callback 函数。

您在调用getJSON 后也遇到了代码块。结果到达后也不会调用其中的代码,它只是一个单独的块,在调用之后以及结果到达之前运行。

将回调函数作为参数放入getJSON的调用中:

function request(argX, callback) {
  $getJSON(parameter, callback);
}

【讨论】:

  • 很好解释,我现在完全明白了。但是,我已经有一个要执行的函数来处理返回的数据,如下所示: $getJSON(url, function(data){...});在这种情况下如何使它工作?
  • @user1824996:在回调函数中调用callback(data);
  • 我刚看完一篇文章得出了同样的结论。感谢您的帮助!
【解决方案2】:

您需要在 ajax 调用完成后执行回调函数:

for(var i=0; i<10; i++) {
   (function(x) {
       request(arg[x], function(n) {
          console.log(n);
       });
   })(i);
}

function request(argX, callback) {
     $.getJSON('/url/json/', callback); //reference callback function
}

【讨论】:

  • 与 Guffa 的答案相同。我只是不确定当已经有一个函数(数据)要执行时如何在 $getJSON() 中传递“回调”参数。请参阅下面的评论。
  • function(data) 被传回,这与上面代码中的function(n) 完全相同。
  • 我不确定我是否完全理解这里。我想说的是,我可以做 $getJSON('/url/json/', function(data){...}, callback); ?不过我认为这是不对的。
猜你喜欢
  • 2010-10-20
  • 1970-01-01
  • 2016-12-15
  • 2011-02-18
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多