jquery - serializing ajax calls with WHEN and DONE
我有几个ajax方法,我想在成功完成所有这些ajax调用后执行一些代码。 我无法改变或重新定义ajax方法。
请让我知道,如何实现这一目标。
我尝试了WHEN,但它立即被调用,而不是等待所有调用完成。(正如所建议的,一旦我在loadData1()中添加了返回,它就可以正常工作。)
现在我的问题是,如果任何请求(loadData1()或loadData2())有错误,那么"then()"没有被执行。 请让我知道,如何实现这一目标。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | var load1 = loadData1(); var load2 = loadData2(); var load3 = loadData3(); var load4 = loadData4(); $.when(load1, load2, load3,load4).then(function () { console.log("All done"); }); function loadData1() { return $.getJSON("http://10.1.2.3/cgi-bin/GetData1.cgi", function (data) { console.log(data); }); } |
谢谢
你可以使用像这样的功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | function first() { return $.ajax(...); } function second(data, textStatus, jqXHR) { return $.ajax(...); } function third(data, textStatus, jqXHR) { return $.ajax(...); } function main() { first().then(second).then(third); } |
检查这个以获取更多细节jquery-promises
您可以尝试使用像这样的实用程序功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | function allCompleted(array) { var deferred = jQuery.Deferred(), counter = array.length, results = []; $.each(array, function(i, item) { item.always(function() { results[i] = [].slice.call(arguments, 0) if (--counter == 0) { deferred.resolveWith(undefined, results); } }); }); return deferred.promise(); } |
然后
1 2 3 4 5 6 7 8 | var load1 = loadData1(); var load2 = loadData2(); var load3 = loadData3(); var load4 = loadData4(); allCompleted([load1, load2, load3,load4]).then(function () { console.log("All done"); }); |
演示:小提琴
你应该在函数中返回一些东西。 这是第一件事。 等待的第二个必须等待函数的结果,而不是
下面是一个模拟4个延迟函数的例子(你的ajax请求)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | // load1, load2, load3, load4 are defined to simulate promises and some work behind it // here is var load1 = loadData1(); var load1 = function () { return $.Deferred(function(defer) { setTimeout(function() { $('#log').append('loadData1()'); defer.resolve(); }, 150); }); } // here is var load2 = loadData2(); var load2 = function () { return $.Deferred(function(defer) { setTimeout(function() { $('#log').append('loadData2()'); defer.resolve(); }, 600); }); } // here is var load3 = loadData3(); var load3 = function () { return $.Deferred(function(defer) { setTimeout(function() { $('#log').append('loadData3()'); defer.resolve(); }, 300); }); } // here is var load4 = loadData4(); var load4 = function () { return $.Deferred(function(defer) { setTimeout(function() { $('#log').append('loadData4()'); defer.resolve(); }, 200); }); } $(document).ready(function() { $.when(load1(), load2(), load3(), load4()) .then(function () { $('#log').append('All done.'); }); }); |
1 | <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"> |
试试这个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | var promise = loadData1(); var load2 = loadData2(); var load3 = loadData3(); var load4 = loadData4(); promise.then(loadData2).then(loadData3).then(loadData4).then(function (E) { // }); function loadData1() { $.getJSON("http://10.1.2.3/cgi-bin/GetData1.cgi", function (data) { console.log(data); }); var deferred = new $.Deferred(); deferred.resolve(); return deferred.promise(); } |