如何使异步功能像常规功能一样工作?

时间:2012-03-15 14:39:03

标签: javascript xmlhttprequest synchronous

我有一个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代码仍然有效,而这段代码将处理响应?

3 个答案:

答案 0 :(得分:1)

使用异步函数,您需要以相反的方式执行此操作。而不是说display(send())你需要起诉send(display)

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

尝试编写display(send())将无效。 send()函数异步生成一个值,但会立即返回。它无法返回异步操作的结果。

答案 1 :(得分:0)

readystatechange处理程序中,响应可在req.responseText上获得。你应该把你的display()调用到该事件处理程序中。

答案 2 :(得分: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)