如何使异步函数像普通函数一样工作?

问题描述:

我有一个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://*.com/questions/1809931/simulating-a-synchronous -xmlhttprequest) – 2012-03-15 14:43:59

+0

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

对于异步函数,您需要以相反的方式进行操作。与其说display(send())你需要起诉send(display)

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

试图写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的一个习惯的方法。引用Synchronous and asynchronous requests

注:你不应该XMLHttpRequests因为,由于网络固有的异步性使用同步,有各种方法记忆和事件可以使用同步请求时发生泄漏。

你知道如何使用回调,何不干脆:

send(display) 
+0

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