【问题标题】:How to get rid of synchronous call in jsonp crossdomain call如何摆脱jsonp跨域调用中的同步调用
【发布时间】:2012-05-24 14:26:26
【问题描述】:

我在 Jquery JSONP 下面有两个调用,它用于跨域调用,现在当页面加载时它会触发这两个调用,问题是现在调用非常快,在快速完成之前它会触发第二个调用这给第二次调用提供了解析器错误(airxml:不是函数)。

如果我们在调用中有 async: false, 现在下面的代码可以正常工作,但根据跨域策略,它不支持同步调用。

var oXMLHTTP, i, length, oData, sValue, sDisplay, sName, sMatch, oRegExp;
     var qr = "&jsonpcall=true";
   if (!oDropdown)
        return;

    oXMLHTTP = this.createXMLHttpRequest();
    this.FilterUrl = sFilterUrl;
    if (sFilterUrl != previousFilterUrl)
    {

        var regUrl = sFilterUrl;               
        var regquest = $.ajax({
            url: regUrl+qr,  
            type: "GET",
            async: false,   
            cache: true,                            
            contentType: "application/json; charset=utf-8",
            dataType: "jsonp",
            jsonpCallback: "airport",                 
            success: function(data, textStatus, jqXHR) 
            {                
                if (data.result[0] != '')
                {
                        sFilterData = data.result[0];                   
                }          
            }
            }); 
        previousFilterUrl = sFilterUrl;
    }

    if(!fireRequestOnce ||(fireRequestOnce && retrievedData == null))
    {       
         var regUrl = sXML;  
         var airquest = $.ajax({
            url: regUrl+qr, 
            async: false,                 
            dataType: 'jsonp',
            jsonpCallback: 'airxml',            
            cache: true,
            success: function(data, textStatus, jqXHR) 
            {
                    var xmlDoc = $.parseXML(data.myresult);
                oData = xmlDoc.documentElement.childNodes;
            }
        });
    }

请建议最好的方法,我尝试在成功事件触发后放置变量,然后尝试调用第二次调用,但没有成功。

【问题讨论】:

    标签: jquery cross-domain jsonp synchronous


    【解决方案1】:

    当您需要顺序 AJAX 调用时,尽量避免使用 async:falsejQuery.ajaxSetup({async:false}); 这些选项的作用是,它会锁定浏览器,直到 AJAX 调用完成。在这种情况下,我更喜欢gnarfajaxQueue 插件。

    这个插件会做的是,它将所有传入的 AJAX 请求排入队列,并一个接一个地处理。如图here所示,使用起来非常简单。

    【讨论】:

    • 所以这个实现将适用于使用 jsonp 的跨域调用
    • umm... 如果不动手就说是不够明智的,我的猜测是,该插件也适用于跨域请求。您可以尝试或直接询问创建者。我个人没有将它用于跨域。我永远不会。我将设置一个服务器端代码,该代码将从另一个域获取数据,并通过同源 ajax 调用将其发送到前端。
    • 你也可以看看 jquery.when/then/pipe !
    • 你也可以使用递归。
    猜你喜欢
    • 2012-06-02
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 2014-05-13
    • 2013-10-31
    • 2014-01-13
    • 1970-01-01
    相关资源
    最近更新 更多