Javascript执行顺序 - 它是怎么做到的?

时间:2009-01-03 16:21:39

标签: javascript jquery

我很遗憾为什么Javascript以这种方式做某些事情,或者我编写错误的东西。但是,在回调完成之前,$ .getJSON之后的代码怎么会被执行?

window.ratingCallback = function(data){

     if(data[0].code == 3){  
         ratingHTML = buildHTML(0);
         console.log('a'+ratingHTML);
         return;
     }

     ratingHTML = buildHTML(data[0].rating);
     console.log('b'+ratingHTML);
     return;
 };

  function buildHTML(pageRating){

     for(counter = 1; counter <= 5; counter++){

         if(counter == pageRating){
                 ratingHTML += '<input name="star1" type="radio" class="star" value="'+counter+'" checked="checked"/>';
         } else {
                 ratingHTML += '<input name="star1" type="radio" class="star" value="'+counter+'"/>';    
         }
     }

     return ratingHTML;
 }


$.getJSON("https://domain.com/"+data+"?jsoncallback=?");

console.log(ratingHTML+"WHY DOES THIS EXECUTE FIRST AND NOT AFTER THE CALLBACK SINCE IT IS PLACED AFTER getJSON????");

我希望它与众不同的原因是我需要将ratingHTML作为全局变量。

我知道当远程服务器给出响应时会调用回调,但是我可以让其余的脚本等待进一步执行吗?不将所有代码放在回调函数或任何函数中?

非常感谢!

3 个答案:

答案 0 :(得分:7)

getJSON()调用是异步的。

甚至在文档(http://docs.jquery.com/Ajax/jQuery.getJSON)中也提到过:

  

注意:请记住,之后的行   此功能将在之前执行   回调。

答案 1 :(得分:4)

getJSON是一个异步方法,它基本上意味着当你调用它时,它会立即返回主程序流。所以这是“非阻塞”。如果要在getJSON完成后进行日志记录,则应将console.log放入回调方法中。或者,如果您不想遵循回调模式并且希望调用是同步的,请使用ajax调用并将async选项设置为false。但请注意,这会导致浏览器阻止,或者在获取数据时显示为冻结。

答案 2 :(得分:3)

AJAX请求通常是异步完成的(AJAX中的第一个A)。这意味着请求将开始,然后它将继续执行它正在执行的代码,而不等待请求返回。

如果您希望它等待,您可以将请求设置为同步模式,但我不确定如何在jquery中执行此操作。