2012-08-31 244 views
0

由於「原生」同步ajax調用阻止瀏覽器用戶界面,它不適合大多數現實世界的情況(至少是我的)。如何模擬同步ajax調用? (基於異步的同步)

我想知道,如果有任何的方式來模擬同步(阻塞)Ajax調用,使用異步(非阻塞)Ajax調用,這樣的結果將是一個同步調用,但沒有阻擋UI。

下面的代碼更好地解釋它:

function do_synchronous_ajax_call(url){ 
    // Performs an asynchronous ajax call, which doesn't block the UI, BUT, blocks this current script execution 
} 

var xyz = do_synchronous_ajax_call("http://...."); // Call is blocking until the inner ajax call returns 
// Process `xyz` from here 

正如你看到的,上面希望有某種「合成」同步Ajax調用,這不會阻塞UI的。

Javascript不支持多線程,所以這可能是不可能的,但值得一問。

這是該主題的第三個問題。
這些問題跟着我當前的問題:
how to block on ajax call (I want it to block)
can a synchronous (blocking) ajax call block the browser's UI?

+0

異步AJAX調用不會阻止UI;這幾乎是故事的結尾。你的問題沒有多大意義。 – Pointy

回答

0

對於UI得到更新,執行需要切換回瀏覽器,並做到這一點的唯一方法是通過異步代碼(或以其他方式立即返回的代碼)

0

爲什麼「阻止」某些東西?看起來你實際上並不瞭解異步流程。你不會「等待」 - 你可以聲明數據可用時該怎麼做。使用回調來設置請求,該請求將包含代碼的其餘部分,調度請求並從Javascript返回,從而讓瀏覽器執行自己的任務,直到您的代碼再次運行。

0

您可以設置一個全局可用的鎖。無論您是使用全局變量,還是您擁有一個可在全局級別保存任何選項或對象的對象集,都可以簡單地使用布爾鎖。

function do_ajax_call(url) 
{ 
    if (!locked) 
    { 
     // yadda yadda yadda 
     locked = true; 

     myxmlhttpobj.onreadystatechange = HandleCallback; 
    } 
} 

function HandleCallback() { 
    if (myxmlhttpobj.readyState==4 && myxmlhttpobj.status==200) 
    { 
     // more yadda yadda 
    } 

    locked = false; 
} 

如果切換到jQuery AJAX您將獲得框架事件和方法,包括「beforeSend」一大堆這樣可以讓你在申請一起選擇了類似的鎖定機制與「完成」事件的利益。