【问题标题】:How to do synchronous cross-domain call in javascript如何在javascript中进行同步跨域调用
【发布时间】:2012-11-22 00:17:59
【问题描述】:

我正在做跨域调用。 这需要更多时间(一些毫秒或 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");
     }

我想同步进行。 这样调用完成后,下面的代码就会执行

请帮忙

提前致谢。

【问题讨论】:

  • 在此处查看async : false,尽管 x-domain req 是另一个问题。
  • @moonwave99 说的:“跨域请求和 dataType: 'jsonp' 请求不支持同步操作。”
  • 做 async:true...它会工作
  • 这与 $.ajax 或 $.get 之类的 jQuery ajax 请求完全无关。这是关于不支持同步请求的 IE 专有 XDomainRequest
  • 您可以使用 dataType "jsonp" 切换到 $.ajax,这将允许跨域请求

标签: jquery ajax cross-domain


【解决方案1】:

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

回到主题。经过几分钟的谷歌搜索,似乎 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 处理程序(您可以将其包装在单独的函数中以便于阅读)。

【讨论】:

  • 感谢怪异的回答。它对我真的很有帮助。如果不可能,让我尝试在加载事件中添加所有代码,稍后我会通知您。一个查询:-是否有其他方法可以解决此问题意味着:-我提到的过程可能不是解决问题的正确方法。非常感谢您提供这些信息。
  • 我看到了很多这样的答案,虽然在大多数情况下异步是有意义的,但在某些情况下它只是不起作用。例如,我正在实现一个 FB 登录按钮。除非我在启动时在页面上加载 JS(我不这样做,因为它可能不会被使用),当用户单击按钮时,我必须在调用该脚本中触发的函数之前加载 FB.js 文件一个弹出窗口。如果我异步加载 JS,我必须传递一个回调,但是许多浏览器会阻止来自匿名函数的弹出窗口。它必须直接位于点击的下游。
猜你喜欢
  • 2012-06-02
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多