jQuery的执行顺序

问题描述:

考虑下面的代码:jQuery的执行顺序

function searchText() { 
    if($('#searchtext').val() == null || $('#searchtext').val().trim() == '') { 
     alert('must provide a text to search for'); 
    return false; 
    } 

    urllink='http://search.twitter.com/search.json?q=' + escape($('#searchtext').val().trim()) + '&callback=?'; 
    $('#results').html(urllink); 

    $.getJSON(urllink,function(data) { 
     var resultT = {}; 
     $('#results').html(data.results[0].profile_image_url); 

     return data.results; 
    }); 
} 

$('#gosearch').click(function() { 
    var data = searchText(); 
    if(data == null) 
     alert('null'); 

    return false; 
}); 

我有萤火断点在searchText()return data.results。但似乎searchText被执行,但我不停止在我的突破点。它宁可检查数据,它是null,并执行alert('null')。那么它会在searchText的折扣点停止。

这是怎么发生的?我不能在事件中执行函数并等待它们完成,然后再移动到代码中的下一行?

感谢

+1

附加了哪个调试器? – 2011-03-14 12:35:12

+0

请使用预览窗格,并在将来正确设置您的文章的格式。另外,我建议你用'if'语句为便携性使用大括号('if(data == null){alert('null');}')。 – 2011-03-14 12:49:09

你没有意识到AJAX是一个同步。所以当searchText()返回ajax请求尚未完成。您需要传递回调并执行该操作,而不是执行return data.results;

下面是一个例子:

function searchText(callback) { 
    if ($('#searchtext').val() == null || $('#searchtext').val().trim() == '') { 
     alert('must provide a text to search for'); 
     return false; 
    } 

    urllink = 'http://search.twitter.com/search.json?q=' + escape($('#searchtext').val().trim()) + '&callback=?'; 
    $('#results').html(urllink); 

    $.getJSON(urllink, function (data) { 
     var resultT = {}; 
     $('#results').html(data.results[0].profile_image_url); 

     callback(data.results); 
    }); 
} 

$('#gosearch').click(function(e) { 
    e.preventDefault(); 
    searchText(function(data) { 
     if (data == null) alert('null'); 
     // do something with your data 
    }); 
}); 
+0

我相信因为这是一个JSONP跨域请求,所以我无法执行同步$ .ajax,对吗?我明白你在说什么,但是这意味着你不能使用ajax在javascript中编写一个很好的结构化程序。一切都必须有回调 – gong 2011-03-14 12:48:29

+0

或者使用同步的XmlHttpRequest。 “AJAX”是一个用词不当。来自jquery文档的 – 2011-03-14 12:49:58

+0

:跨域请求和dataType:“jsonp”请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,并在请求处于活动状态时禁用任何操作。 – gong 2011-03-14 12:53:28

要以异步方式从urllink获取数据,并在返回data.result所在的函数是一个回调函数,当调用URL完成将被调用。

后续代码不会等待异步调用完成。