2013-07-24 101 views
1

之後工作我有一個神祕的問題...我嘗試將外部頁面的一部分放入一個變量中。 下面是代碼:

$.get(url, function(data) { 
    title = $(data).find('#layout-column_column-1 .journal-content-article').html(); 
}, 'html'); 
alert(title); 

在我的瀏覽器使用JavaScript控制檯(這是Chrome,但那是別人的一樣),當我再執行該代碼,alert(title)返回「不確定」。然後,如果我再次運行它(或只是行alert(title)),我已經得到了我期望的結果。

任何人有想法? :)

編輯: 對不起,我該給的代碼沒有完成:

var a = $('a[target="_faq"]'); 
a.each(function() { 
    [...] 
    var title; 
    $.get('url', function(data) { 
     title = $(data).find('#layout-column_column-1 .journal-content-article').html(); 
    }, 'html'); 
    $(this).attr('title', title); 
} 
+7

歡迎來到異步加工的世界 –

+2

這並不神祕。這是JavaScript的工作原理。 – mekwall

回答

2

這就是異步的手段。

$.get(url, function(data) { 
    title = $(data).find('#layout-column_column-1 .journal-content-article').html(); 
    alert(title); 
}, 'html'); 

這意味着發送請求(或更確切地說在接收到響應)被取出的正常執行流程。

重度推薦@菲利克斯的偉大答案:How do I return the response from an asynchronous call?

2

這是因爲$ .get()發送了一個異步處理的ajax請求,這意味着一旦發送請求,下一個腳本就會在不等待響應的情況下執行。

它正在第二次嘗試,因爲title是一個全局變量。發送第一個請求時,警報顯示undefined,然後當響應返回時,將title變量的值更新爲返回值。當第二次嘗試時,請求被再次發送,但是當執行警報時,標題已經使用第一個請求的值更新,因此它被顯示。

在任何異步處理中,異步活動返回的值必須由回調方法處理。

1

get方法(以及ajaxpost)在「另一個線程」(在引號之間,因爲javascript不是多線程)中執行。

調用get方法,然後請求開始執行,代碼繼續執行到alert(title),該代碼位於異步方法之外,因此在第一個方法結束之前執行。

把你的戒備裏面get。解決問題

相關問題