【问题标题】:Concurrent AJAX callbacks: how to synchronize them?并发 AJAX 回调:如何同步它们?
【发布时间】:2013-07-11 20:53:10
【问题描述】:

我的应用程序通过 AJAX/JSONP 加载 HTMLJavaScript 而不是通过标准方式加载页面。它在 Iframe 中工作,因此,这是与父 Frame 保持通信的正确方式(Safari 限制)。

我必须提出 2 个请求:为自定义页面加载 JavaScriptHTML。为了确保一切正常,我可以先加载 JavaScript 然后加载 HTML(在 JavaScript onload 回调中)。但我希望同时发送这两个请求。

我准备了代码。当 JavaScriptHTML 都已加载时,脚本必须调用 _finishLoading()_finishLoading() 函数是否可能不会在浏览器中执行?

 function Loader()
 {
       this.load = function()
       {
                    // ...some code here...

        var this_ = this;

        var jsLoaded = false;
        var htmlLoaded = false;

        $.ajax(
            url: newUrl,
            dataType: "jsonp",
            jsonpCallback:
                function()
                {
                    $.ajax(
                        url: someUrl,
                        dataType: "html",
                        success:
                            function( data )
                            {
                                $( '#' + contentElId ).html( data );

                                if( htmlLoaded )
                                {
                                    this_._finishLoading()
                                }

                                jsLoaded = true;
                            }
                    );
                }
        );

        $.ajax(
            {
                url: someUrl2,
                dataType: "html",
                success:
                    function( data )
                    {
                        $( '#' + contentElId ).html( data )

                        if( jsLoaded )
                        {
                            this_._finishLoading()
                        }

                        htmlLoaded = true;
                    }
            }
        );
    }

}

更新

我需要加载 JavaScript、HTML,然后调用 onload() 来初始化加载的 Javascript。 如果您知道更方便的方法,请单独加载它们,请告诉我

【问题讨论】:

    标签: javascript html ajax iframe jsonp


    【解决方案1】:

    考虑使用$.when()函数

    代码应该是这样的:

            var this_ = this;
    
            var jsLoaded = false;
            var htmlLoaded = false;
            var deferred = $.Deferred();
            $.ajax(
                url: newUrl,
                dataType: "jsonp",
                jsonpCallback:
                    function()
                    {
                        $.ajax(
                            url: someUrl,
                            dataType: "html"
                            success: function(){
                               deferred.resolve();
                            }
                        );
                    }
            );
    
            var promise2 = $.ajax(
                {
                    url: someUrl2,
                    dataType: "html",
                }
            );
    
            $.when(deferred, promise2).done(function(a1, a2){
               $( '#' + contentElId ).html(a1);
               $( '#' + contentElId ).html(a2);
               this_._finishLoading()
            });
    

    【讨论】:

    • 我不认为这个例子像 promise1 在调用 $.when() 时未定义。但这是正确的想法,尽管我认为您可能需要创建自己的 $.Deferred(以便它对 $.when() 有效),然后通过管道将内部 $.ajax() 传递给它。
    • @TommiKomulainen 是的,你说得对,谢谢你纠正我。我更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 2021-02-20
    相关资源
    最近更新 更多