如何在javascript中进行同步跨域调用

时间:2012-11-21 14:11:12

标签: jquery ajax cross-domain

我正在进行跨域调用。 这需要更多时间(几毫秒或一秒)。

以下代码正在执行。

var xdr;
    if (window.XDomainRequest) // Check whether the browser supports XDR. 
    {
        xdr = new XDomainRequest(); // Create a new XDR object.
        if (xdr) {
            xdr.onload = function () {
                var data = $.parseJSON(xdr.responseText);
                AddData(data, link);
            };
            xdr.open("post", urlSearch);
            xdr.send();
        }
        else {
            alert('Server Error!! Try Later.');
        }
    }
    else {
         alert("Not IE 8");
     }

我想做同步。 所以在完成调用之后,代码将执行

请帮助

提前致谢。

1 个答案:

答案 0 :(得分:4)

只是为了澄清一下,因为一些“JavaScript”程序员往往是jQuery程序员(我怀疑他们甚至可以这样,我在谈论评论)。

回到主题。几分钟的谷歌搜索后,似乎XDomainRequest对象不支持支持同步调用。

这实际上很好。你不知道的是同步AJAX(注意同步AJAX本身就是一个矛盾 - 首先是A代表异步)是浏览器中所有邪恶的根源。为什么?因为JavaScript是单线程的,所以当用户等待请求完成时他无法做任何事情 - 整个页面被阻止(在某些更糟糕的情况下,就像IE8我认为,整个浏览器被阻止)。

那你该怎么办?你应该做每个优秀的JavaScript程序员所做的事情,并以异步方式编写代码。例如:

var xdr;
if (window.XDomainRequest) { // Check whether the browser supports XDR. 
    xdr = new XDomainRequest(); // Create a new XDR object.
    xdr.onload = function () {
        var data = $.parseJSON(xdr.responseText);
        AddData(data, link);
        // other code goes here
    };
    xdr.onerror = function () {
        alert('Server Error!! Try Later.');
    };
    xdr.open("post", urlSearch);
    xdr.send();
} else {
    alert("Not IE 8");
}

如果您有更多依赖于xdr的代码,那么只需将其添加到onload处理程序(您可以将其包装在单独的函数中以使其更易于阅读)。