如何协调同步ajax调用并仅在所有调用完成后才采取行动?
是否有一个方便的javascript助手库,它将协调多个同时ajax调用数据库并在所有ajax数据提取返回其数据时调用指定的回调?我想向这个“协调员”或“经纪人”以及我的WhenAllCompleted回调函数提交一份准备就绪和准备好的ajax调用字典。
用例是常见的:在将数据库记录绑定到UI之前,必须填充外键数据关系的所有下拉列表,以便用户看到有意义的值而不是整数键通常存储在记录中。
如果有一个强大的标准库已经存在,我宁愿不重新发明所有的管道代码来跟踪每个ajax请求的状态。
编辑: 这是描述我想要做的伪代码:
when ajax1fetch is finished
and
ajax2fetch is finished
and
ajax3fetch is finished
and SELECT1 is populated
and SELECT2 is populated
and SELECT3 is populated
bindRecordToUI()
在我重构代码以使用$.when()
之前,我在.ajax()成功回调中获取数据,并在该回调中填充SELECT;当填充SELECT时,我将记录绑定到UI。
如果我们向$.when
提供ajax调用列表,则在ajax请求完成时调用完成回调,这将在之前发生填充SELECTs(如果项目列表为SELECT非常长。)
不知何故,我需要将SELECT元素的填充包含为附加的when条件,并找到一种方法将ajax调用返回的数据路由到填充函数,如果SELECT-populate函数不会被执行在.ajax成功回调中。
答案 0 :(得分:3)
您正在寻找JS中的promises。这是一个很好的框架Q。 allSettled()
函数就是您要找的东西。
Q.allSettled([saveToDisk(), saveToCloud()]).spread(function (disk, cloud) {
console.log("saved to disk:", disk.state === "fulfilled");
console.log("saved to cloud:", cloud.state === "fulfilled");
}).done();
的代码
答案 1 :(得分:1)
由于您已经在使用jQuery,因此可以使用jQuery.when()
方法等待多个Deferred
完成。请注意,jQuery.ajax()
(及其包装方法,如jQuery.get()
)会返回jqXHR
类型的Deferred
对象。
您将从Deferred
或同等号码的电话中获取$.ajax
,然后将所有内容传递给$.when
。您将返回Promise
,这基本上是只读Deferred
*。然后,您可以将完成/错误处理程序附加到此Promise
,这将在您的所有传入的Deferred
被解析后解析,或者如果您Deferred
中的任何一个被拒绝,则会被拒绝被拒绝了。
var def1 = $.ajax(),
def2 = $.ajax({ /* some params */});
var masterPromise = $.when(def1, def2);
masterPromise.done(function() {
console.log('def1 and def2 are done!');
});
Deferred
允许附加各种完成和错误处理程序,以及解析和取消以及以其他方式控制异步操作。 Promise
仅允许附加处理程序,并且不允许控制异步操作。您可以使用Promise
方法从jQuery Deferred
获取Deferred.promise()
。