等到三个 ajax 调用解决触发函数(延迟?)

Posted

技术标签:

【中文标题】等到三个 ajax 调用解决触发函数(延迟?)【英文标题】:Wait until three ajax calls have resolved to fire function (defer?) 【发布时间】:2016-05-13 12:00:33 【问题描述】:

我需要等到三个 ajax 调用完成后再开始另一个函数。我已经尝试使用 jquery deferred promise https://api.jquery.com/deferred.promise/ 但我的作业在延迟数据加载之前返回。在触发函数之前,我需要强制完成这三个 ajax 调用。我不拘泥于使用延迟,这似乎是合乎逻辑的方式。

我正在使用数据表,需要在将数据加载到其中之前完成 ajax 调用。

"ajax":
        "url": API_ROOT + "jobs?available=true&max_results=500",
        "dataSrc": function(data)
            function all_loaded()
                var dfd = $.Deferred();
                var mats_loaded, fins_loaded, pros_loaded;
                setTimeout(function()
                $.ajax(
                    url: API_ROOT + "finishes?max_results=500",
                    dataType: 'json',
                    error: function()
                        console.log("Error getting finishes");
                    ,
                    success: function(data) 
                        finishes = data._items;
                        fins_loaded = true;
                        check_all_loaded();
                    
                );
                ,2000);
​
                $.ajax(
                    url: API_ROOT + "processes?max_results=500",
                    dataType: 'json',
                    error: function()
                        console.error("Error getting processes");
                    ,
                    success: function(data) 
                        processes = data._items;
                        pros_loaded = true;
                        check_all_loaded();
                    
                );
​
                $.ajax(
                    url: API_ROOT + "materials?max_results=500",
                    dataType: 'json',
                    error: function()
                        console.log("Error getting materials");
                    ,
                    success: function(data) 
                        materials = data._items;
                        mats_loaded = true;
                        check_all_loaded();
                    
                );
​
                check_all_loaded = function()
                    if (mats_loaded && fins_loaded && pros_loaded)
                        dfd.resolve("Loaded");
                    
                
​
                return dfd.promise();
            
​
            $.when( all_loaded()).then(function()
                var jobs = data._items;
                //a bunch of other stuff
                return jobs;
            );
        
    

.when 最终触发,这不是问题,问题在于 .when 没有返回任何数据,因为 Ajax 调用尚未完成。本质上,我们需要 .when 来停止执行所有 js,直到 promise 被解决。

抱歉,代码太长了,我只是想完整一下,并想说明我有三个单独的 Ajax 调用。谢谢你的想法。

【问题讨论】:

我认为三个ajax调用都完成了。您能否在您的then 回调中访问materialsfinishesprocesses,而不是data,看看它是否有效。可能是data 对象的范围问题。 【参考方案1】:

您需要使用 javascript 来源的数据初始化数据表(请参阅data 选项)之后您的 Ajax 调用完成,而不是直接使用 Ajax 来源的数据和 ajax 选项。 p>

例如:

var ajax1 = $.ajax( /*...*/ );
var ajax2 = $.ajax( /*...*/ );
var ajax3 = $.ajax( /*...*/ );

// When all Ajax requests were successful
$.when(ajax1, ajax2, ajax3).done(function(a1, a2, a3)
   // a1, a2 and a3 are arguments resolved 
   // for the ajax1, ajax2 and ajax3 Ajax requests, respectively.

   // Each argument is an array with the following structure:
   // [ data, statusText, jqXHR ]

   // Merge data from three Ajax calls
   var data = a1[0]._items.concat(a2[0]._items, a3[0]._items);

   // IMPORTANT:
   // Initialize data table once all Ajax requests are successful
   $('#example').DataTable( 
     data: data,
     // ... other options ...
   );
);

【讨论】:

谢谢,这是最终与我正在使用的数据表一起工作的答案。【参考方案2】:

您可以使用 $.when 并传递您需要等待的所有 ajax 调用。

例子:

var ajax1 = $.ajax(..)
var ajax2 = $.ajax(..)
var ajax3 = $.ajax(..)
$.when(ajax1, ajax2, ajax3).then(function()
 oncomplete code here...
);

【讨论】:

我喜欢!我唯一要添加的是$.when(ajax1, ajax2, ajax3).then( successFunction(), failureFunction())。在代码的其他地方定义successFunction()failureFunction() 是的,这是下一步,这样您将拥有更清晰的代码。 这行不通,因为为data 选项定义的函数必须返回值,该值是来自所有三个调用的数据。使用您的解决方案是不可能的,因为数据在回调中可用。 是的,这只是迈向答案的一步。为了让他获取数据,回调应该将响应保存到另一个变量,该变量可以通过 $.when 访问。 或者更确切地说,回调可以已经被删除,并在何时移入:)

以上是关于等到三个 ajax 调用解决触发函数(延迟?)的主要内容,如果未能解决你的问题,请参考以下文章

延迟href执行点击直到ajax调用之后

优雅的 javascript - 在发生 3 个不同的 AJAX 请求时触发函数

ajax请求响应过长怎么解决

关于AJAX调用,得到返回值总为undefined的疑问

如果没有延迟初始化,回流触发器将无法工作

Javascript onkeyup延迟函数调用[重复]