0

我的代码如下所示:

jQuery.getJSON( "url/to/some/script.php", function( data ) {
     var test = data.someValue;
      console.log('This message should occur first');
});

console.log('this message should occur second');

// do things with data retrived above...

发生的事情是,第一个console.log是在第二个之后执行。我想是因为发出 Ajax 请求需要时间,但我没有意识到它会继续向下移动脚本而没有完成。因此,当我尝试在代码中直接使用它们时,AJAX 请求产生的变量是“未定义的”。

处理这种情况的最佳方法可能是什么?

4

3 回答 3

1

使用 Promise 接口,它允许像 jQuery.getJSON() 这样的 jQuery 的 Ajax 方法链接一个或多个回调

jQuery.getJSON( "url/to/some/script.php", function( data ) {
 var test = data.someValue;
     console.log('This message should occur first');
}).done(function() {
    console.log('this message should occur second');
}):
于 2013-10-08T21:27:34.587 回答
1

在所谓的异步编程中,只有一个有效的解决方案:将你应该在 Ajax 完成后运行的代码放入函数中,即:

jQuery.getJSON( "url/to/some/script.php", function( data ) {
  var test = data.someValue;
  console.log('This message should occur first');

  console.log('this message should occur second');
  // And all code that should be run after Ajax should go here
});

在传统语言(例如 PHP)中,下一行代码在前一行代码之后执行。如果某行有很长时间的动作(如数据库或Ajax请求),则程序将停止执行,直到该行得到请求的结果。

相反,在异步编程中,程序不会停止。它记得这个回调函数应该在请求完成后调用,并立即继续运行所有后续行。因此,程序不必停下来等待。但这意味着您所有需要请求结果的代码都应该放在回调函数中。

于 2013-10-08T21:25:33.220 回答
0

您可以使用 jquery 承诺http://api.jquery.com/promise/来帮助处理异步 javascript

$.getJSON("url/to/some/script.php").success(function(data) {
  var test = data.someValue;
      console.log('This message should occur first');
}).done(function() {
console.log('this message should occur second');
// do things with data retrived above...
});
于 2013-10-08T21:29:54.227 回答