2

我正在做跨域调用。这需要更多时间(一些毫秒或 1 秒)。

所以下面的代码正在执行。

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

我想做那个同步的。这样在调用完成后,下面的代码将执行

请帮忙

提前致谢。

4

1 回答 1

4

澄清一下,因为一些“JavaScript”程序员实际上往往是 jQuery 程序员(我怀疑他们甚至可以是这样,我说的是评论)。

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

这实际上很好。您不知道的是,同步 AJAX(请注意,同步 AJAX 本身就是一个矛盾 - 第一个 A 代表 Asynchronous )是浏览器中万恶之源。为什么?因为 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处理程序(您可以将其包装在单独的函数中以使其更易于阅读)。

于 2012-11-21T16:17:59.983 回答