Javascript 如何使异步函数像常规函数一样工作?

Javascript 如何使异步函数像常规函数一样工作?,javascript,xmlhttprequest,synchronous,Javascript,Xmlhttprequest,Synchronous,我有一个XMLHttpRequest需要的代码。它是一个向服务器发送请求的对象,并且它是异步的,因此当我想要接收响应时,我需要提供回调函数来调用此对象的onreadystatechange属性。接收到响应后调用此函数: function send() { XMLHttpRequest req = new... req.onreadystatechange = answer; } function answer() { //handling the answer... } 这

我有一个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...
   };
}
但现在我想在另一个函数中使用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)