2012-03-15 92 views
0

我有一個XMLHttpRequest的代碼。這是一個向服務器發送請求的對象,它是異步的,所以當我想要接收響應時,我需要爲此對象的onreadystatechange屬性提供回調函數。而這個功能是接收響應後叫:如何使異步函數像普通函數一樣工作?

function send() 
{ 
    XMLHttpRequest req = new... 
    req.onreadystatechange = answer; 
} 

function answer() 
{ 
    //handling the answer... 
} 

所以這是偉大的,但我不希望使用新的功能來處理答覆,所以我做匿名:

function send() 
{ 
    XMLHttpRequest req = new... 
    req.onreadystatechange = function() 
    { 
     //handling the answer... 
    }; 
} 

但現在我想使用其他功能的發送功能的結果,例如顯示結果:

display(send()) 

那麼如何使這項工作?就像:

function send() 
{ 
    XMLHttpRequest req = new... 
    req.onreadystatechange = function() 
    { 
     //handling the answer... 
     return result; //where result is returned by send function 
    }; 
} 

有沒有辦法做到這一點,以便其他JS代碼仍然可以工作,而這段代碼將處理響應?

+0

[模擬同步的XmlHttpRequest]的可能重複(http://stackoverflow.com/questions/1809931/simulating-a-synchronous -xmlhttprequest) – 2012-03-15 14:43:59

+0

+ Andrew Marshall不一樣。 – 2012-03-15 15:20:20

回答

1

對於異步函數,您需要以相反的方式進行操作。與其說display(send())你需要起訴send(display)

function send(callback) 
{ 
    XMLHttpRequest req = new... 
    req.onreadystatechange = function() 
    { 
     //handling the answer... 
     callback(result); 
    }; 
} 

試圖寫display(send())將無法​​正常工作。函數send()異步產生一個值,但會立即返回。它不能返回異步操作的結果。

0

readystatechange處理程序中,響應在req.responseText上可用。你應該把你的電話打到display()裏面。

0

可以使用同步AJAX調用:

XMLHttpRequest req = new... 
var result = null; 
req.onreadystatechange = function() { 
    if (req.readyState == 4) { 
    if (req.status == 200) { 
     result = req.responseText; 
    } 
    } 
}; 
req.open('GET', url, false); //async = false 
return result; 

但是,這是一個貧窮的做法,而不是使用JavaScript的一個習慣的方法。引用Synchronous and asynchronous requests

注:你不應該XMLHttpRequests因爲,由於網絡固有的異步性使用同步,有各種方法記憶和事件可以使用同步請求時發生泄漏。

你知道如何使用回調,何不乾脆:

send(display) 
+0

我甚至不會建議使用同步XHR - [這比糟糕的做法更差](http://stackoverflow.com/a/7337091/201952)。 – josh3736 2012-03-15 14:48:10

相關問題