2

我正在尝试创建一个生成 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;
}

正如您所看到的,现在我正在使用同步调用,但这不是最佳解决方案,因为在我的调试中很常见服务器端出现问题并最终冻结我的浏览器。有没有办法使调用异步让函数返回响应?

4

3 回答 3

3

你不能返回不存在的东西。但是如果你害怕在永恒中缩进回调,你可以返回一个 promise 对象。这是一个非常简单的例子:

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);
});

许多框架已经实现了延迟对象。

于 2012-08-21T21:03:30.047 回答
2

这是不可能的,因为浏览器中的 JavaScript 引擎(除了网络工作者)本质上是单线程的。如果您希望您的msg()函数从服务器返回响应,则调用该函数将花费至少与 HTTP 请求所需的时间一样多的时间。此外,由于 JavaScript 引擎是单线程的,到那时没有其他代码可以运行。因此浏览器必须在同步 HTTP 调用期间冻结。

您无法解决它,也没有图书馆可以提供帮助,这就是 cookie 崩溃的方式。您要么有阻塞呼叫,要么使用回调(我想您可以这样做)。

也可以看看

于 2012-08-21T20:54:57.057 回答
2

完全异步并将回调作为参数传递给函数。这是使用 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));
}
于 2012-08-21T20:56:29.823 回答