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