2011-03-14 77 views
0

考慮下面的代碼: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

回答

2

你沒有意識到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

1

要以異步方式從urllink獲取數據,並在返回data.result所在的函數是一個回調函數,當調用URL完成將被調用。

後續代碼不會等待異步調用完成。