2009-10-10 82 views
2

爲了更好地組織代碼,我沒有在req.onreadystatechange處理程序中放置回調函數,而是簡單地返回數據。如何返回AJAX響應文本?

在下面的JavaScript中,「raw_data」var是未定義的,因爲在ajax響應之前調用了parse_data()函數。

function dostuff(){ 
    var raw_data = ajax_fetch_data(); 
    var parsed_data = parse_data(raw_data); 
} 

是否有可能不是ajax_fetch_data()返回的數據中調用parse_data(),直到req.onreadystatechange?

我不喜歡將parse_data()調用作爲ajax_fetch_data()中的回調嵌套。

+0

不要告訴他。現在他要回去接受所有問題的隨機回答。 – 2009-10-10 03:20:09

+1

啊,對不起所有人。我不知何故忽略了你應該接受答案的事實。思考答案的質量只是反映了他們的選票數量。我會確保回去接受我的問題的正確答案。 – makeee 2009-10-10 03:28:07

回答

1

Ajax中的A表示「異步」。如果你的調用是異步的,就不可能使用這樣的返回值。你必須等待事件回調。但是,可以發送這樣的同步請求:

var req = new XMLHttpRequest(); 
req.open('GET', 'http://www.example.org/', false); 
req.send(null); 
if(req.status == 200) 
    return req.responseText; 

其中在第二行上的false指定同步特性(第三個參數的默認值是true)。

還有更多在Mozilla Developer Center

+1

錯誤。可以創建一個同步請求。 – 2009-10-10 07:24:06

+0

感謝您的反饋。我已經改變了包含同步請求的答案。讓我知道,如果你發現更多的錯誤。 – 2009-10-10 07:43:52

+0

你的答案仍然意味着,makeee想要做什麼是不可能的,但是你會以一個如何完成他想做的事情的例子來追蹤它。 – 2009-10-10 08:19:27

1

此代碼過於模糊: var raw_data = ajax_fetch_data();

通常是這樣的:

// url = ... 
// data = ... 
create_ajax_request(url, data, callback); 
// This will continue to execute like normal 
// ... 
// ... 
// ... 

// Now, in a differnt part of the code: 
function callback() { 
    // Sometime later, when AJAX returns data, this is called. 
} 

所以基本上你有兩個線程:主程序,你的「開始」的請求,並請求完成時調用回調函數。這仍然忽略了細節。

如果你想SJAX(壞的縮寫syncronous的JavaScript & XML),那麼你可以使用類似的jQuery:

var result = null; 
$.ajax({ 
    aync: false, 
    data: data, 
    url: url, 
    success: function(data) { 
     result = data; 
    } 
}); 
// result is populated before $.ajax() moves on, so you can use it right after 
console.log('result: ' + result); 

然而,這種執行忙等待(即瀏覽器被卡住/鎖定,直到數據進入...可能是幾毫秒,可能是一分鐘,誰知道)。所以這隻能在必要時使用。如果您只想獲取數據並進行處理,請使用回調。

// Call this to start a request 
function startRequest() { 
    data = ... 
    create_ajax_request(url, data, continueRequest); 
} 

// This is called once we have the data 
function continueRequest(data) { 
    alert(data); 
} 

這是比較典型的AJAX程序。