Javascript 如何使异步函数像常规函数一样工作?
我有一个XMLHttpRequest需要的代码。它是一个向服务器发送请求的对象,并且它是异步的,因此当我想要接收响应时,我需要提供回调函数来调用此对象的Javascript 如何使异步函数像常规函数一样工作?,javascript,xmlhttprequest,synchronous,Javascript,Xmlhttprequest,Synchronous,我有一个XMLHttpRequest需要的代码。它是一个向服务器发送请求的对象,并且它是异步的,因此当我想要接收响应时,我需要提供回调函数来调用此对象的onreadystatechange属性。接收到响应后调用此函数: function send() { XMLHttpRequest req = new... req.onreadystatechange = answer; } function answer() { //handling the answer... } 这
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...
};
}
但现在我想在另一个函数中使用send函数的结果,例如显示结果:
display(send())
那么,如何使这项工作?比如:
function send()
{
XMLHttpRequest req = new...
req.onreadystatechange = function ()
{
//handling the answer...
return result; //where result is returned by send function
};
}
有什么方法可以做到这一点,使其他JS代码在处理响应时仍能工作?对于异步函数,您需要以相反的方式来完成。不要说
display(send())
你需要起诉send(display)
尝试写入
display(send())
将不起作用。send()
函数异步生成一个值,但立即返回。它无法返回异步操作的结果 在readystatechange
处理程序中,可以在req.responseText
上获得响应。您应该在事件处理程序中调用display()
您可以使用同步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的惯用方法。引述:
注意:您不应该使用同步XMLHttpRequests
,因为,由于网络固有的异步性质,在使用同步请求时,内存和事件有多种泄漏方式
您知道如何使用回调,为什么不简单地:
send(display)
+Andrew Marshall的可能副本不一样。我甚至不建议使用同步XHR--。
send(display)