2011-09-22 62 views
5

我寫了一個JavaScript函數,它使用XmlHttpRequest異步調用Web服務。我被要求在頁面呈現之前讓這個功能完成它的工作。是否有可能中止同步XmlHttpRequest?

我想我可以使AJAX請求同步,但我不想讓這個頁面掛起時間過長 - 如果沒有收到響應,我想在1秒之後中止請求。

是否有可能中止同步XmlHttpRequest?

+0

問題聽起來是「我可以設置同步XMLHttpRequest的客戶端腳本超時」? –

回答

4

您不能:

http://www.hunlock.com/blogs/Snippets:_Synchronous_AJAX賽斯: 「同步AJAX(真SJAX - 同步JavaScript和XML)是模式,這意味着,直到結果已經從服務器獲取的JavaScript將停止處理程序當請求正在處理時,瀏覽器被有效地凍結,瀏覽器將該呼叫視爲警告框或提示框,只是它不等待來自用戶的輸入,而是通過遠程服務器的輸入「

一旦瀏覽器運行同步請求,它將等待,直到它會得到響應。

2

首先,同步AJAX調用是邪惡的,因爲它們阻塞了整個JavaScript瀏覽器引擎(您知道)。

只是簡單地進行異步調用,並且如果到達後的時間比一秒鐘後不夠就丟棄結果?如果你真的想等你仍然可以使用setTimeout()結果(jQuery的爲了方便,不要求):

var result; 
var xhr = $.ajax('/url', function(response) { 
    result = response; 
}); 
setTimeout(function() { 
    if(result) { 
    //AJAX call done within a second, proceed with rendering 
    } else { 
    //One second passed, no result yet, discard it and move on 
    xhr.abort(); 
    } 
}, 1000); 

通過這種方法,你不會阻止瀏覽器,同時還不必等待AJAX呼叫。

+0

「同步AJAX調用是邪惡的」 - 取決於,因爲有時需要阻止整個JavaScript瀏覽器引擎:) –

1

XMLHttpRequest支持abort方法,你可以在這裏得到更多的細節吧:http://www.w3.org/TR/XMLHttpRequest/#the-abort-method

但你需要檢查多少browserы支持。例如,在Windows Internet Explorer 7及更高版本中引入了abort

在調用send()方法XMLHttpRequest對象之前或之後,您可以設置一個延遲n秒的定時器,它將中斷正在進行的異步操作。

0

它可能在IE.Use超時屬性。下面

代碼爲我工作

xmlhttp.open("method","url",false); 
xmlhttp.timeout="time in ms"; 
xmlhttp.ontimeout=function(){}; 
xmlhttp.send(); 
相關問題