多个同时ajax请求经纪人

时间:2014-08-18 17:08:09

标签: javascript jquery ajax

如何协调同步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成功回调中。

2 个答案:

答案 0 :(得分:3)

您正在寻找JS中的promises。这是一个很好的框架QallSettled()函数就是您要找的东西。

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();

取自API-reference

的代码

答案 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()