我正在尝试创建一个生成AJAX调用并返回响应的函数。
function msg(message)
{
send = new XMLHttpRequest();
send.open("POST", "msghandler.php", false);
send.setRequestHeader("Content-type","application/x-www-form-urlencoded");
send.send("msg="+encodeURI(message));
return send.responseText;
}
正如您所看到的,我现在正在使用同步调用,但这不是最佳解决方案,因为在我的调试中,在服务器端出错并最终冻结浏览器时非常常见。有没有办法使调用异步和让函数返回响应?
答案 0 :(得分:4)
您无法返回不存在的内容。但是如果你害怕在永恒中缩进回调,你可以返回一个承诺对象。这是一个非常简单的例子:
function msg(message) {
var done = function(){};
send = new XMLHttpRequest();
send.open("POST", "msghandler.php", true);
send.setRequestHeader("Content-type","application/x-www-form-urlencoded");
send.send("msg="+encodeURI(message));
send.onreadystatechange = function() {
if(send.readyState == 4){
done(send.responseText);
}
});
return {
ready: function(fn) { done = fn; }
};
};
msg('foo').ready(function(response) {
alert(response);
});
许多框架已经实现了延迟对象。
答案 1 :(得分:3)
这是不可能的,因为浏览器中的JavaScript引擎(除了Web工作者)本质上是单线程的。如果您希望msg()
函数从服务器返回响应,则对该函数的调用将至少花费与HTTP请求所需的时间。此外,因为JavaScript引擎是单线程的,所以到那时还没有其他代码可以运行。因此,在同步HTTP调用期间,浏览器必须冻结。
你不能解决它,没有图书馆可以提供帮助,这就是cookie崩溃的方式。您可以使用阻止调用或使用回调(我猜您可以这样做)。
答案 2 :(得分:3)
完全异步并将回调作为参数传递给函数。这是使用JavaScript的正确方法。做类似的事情:
function msg(message, callback)
{
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
// asynchronously call the callback with the result
callback(xmlhttp.responseText);
}
}
xmlhttp.open("POST", "msghandler.php", true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("msg="+encodeURI(message));
}