如何创建执行AJAX调用的函数?

时间:2012-08-21 20:49:04

标签: javascript ajax

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

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

3 个答案:

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