如何使异步函数像普通函数一样工作?
我有一个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代码仍然可以工作,而这段代码将处理响应?
对于异步函数,您需要以相反的方式进行操作。与其说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)
我甚至不会建议使用同步XHR - [这比糟糕的做法更差](http://*.com/a/7337091/201952)。 – josh3736 2012-03-15 14:48:10
[模拟同步的XmlHttpRequest]的可能重复(http://*.com/questions/1809931/simulating-a-synchronous -xmlhttprequest) – 2012-03-15 14:43:59
+ Andrew Marshall不一样。 – 2012-03-15 15:20:20