javascript - JQuery 延迟对象和 ajax 调用

标签 javascript jquery jquery-deferred

我正在尝试了解 JQuery Deferred 对象。我正在开发一个 JS 框架,它加载一个模板和一些 JSON 对象,并使用它们生成一些 HTML。最初的方法是按顺序加载它们(伪代码):

load_template(template_url, function (template_data) {
    load_json(json_url, function (json_data) {
       render(template_data, json_data);
    });
});

这是次优的,因为 json 仅在模板加载后才开始加载。我修改了它以使用延迟对象:

$.when(load_template, load_json).done(function (template_xhr, json_xhr) {
    render(template_xhr[0], json_xhr[0]);
});

到目前为止一切顺利。现在我有一个称为“partials”的东西,它们是一些内联的 HTML 片段,它们是根据单独的模板和 JSON 数据构建的,这些数据是异步请求的,然后插入到页面中。目前,我在主模板呈现后开始加载它们:

load_template(template_url, function (template_data) {
    load_json(json_url, function (json_data) {
       render(template_data, json_data);
       $.each(partials, function (idx, partial_url) {
           load_partial(partial_url, function (partial_data) {
               $("#some-element-id").html(partial_data);
           });
       }); 
    });
});

这又不是最佳选择,因为我可以在主模板之后立即开始同时加载它们。

然而,这样做的问题是,部分模板可以在主模板加载和渲染之前完成加载,因此没有地方可以插入它们。或者他们可以稍后完成。

将它们放入单个 $.when() 调用中并不好,因为我想在主模板和 JSON 数据准备好后立即显示页面,因此以下内容将不起作用:

$.when(load_template, load_json, load_partial_template, load_partial_json, ...).done(function (template_xhr, json_xhr, ...) {
    render(template_xhr[0], json_xhr[0]);
    insert_partial(...);
});

所以,问题是:

是否可以使用 Deferred 对象来设置一系列 ajax 请求,以便将它们分为几组:

  • 所有请求同时发起
  • 当“组 1”的请求完成时,将调用回调函数
  • 保证不会在“group 1”回调之前调用来自“group 2”...“group n”的回调,但它们最终仍会被调用 - 在相应请求完成之后或在“group 1”回调之后,取决于花费的时间更长。

最佳答案

您能否为部分结果设置一组 Deferreds 和一个主 Deferred,然后仅在主 Deferred 完成后才对部分结果执行某些操作?

var dfdPartials = [];
$.each(partials, function (idx, partial_url) {
    dfdPartials.push($.when(createDeferredForPartial(partial_url));
});

var dfdTemplate = $.when(load_template, load_json).done(function (template_xhr, json_xhr) {
    render(template_xhr[0], json_xhr[0]);
    $.each(dfdPartials, function (idx, dfd) {
        dfd.done(function (partial_data) {
            $("#some-element-id").html(partial_data);
        });
    });
});

关于javascript - JQuery 延迟对象和 ajax 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9633507/

相关文章:

jquery - jQuery Deferred and Promises是什么设计模式?

javascript - loadFromJSON 不包括 fabric js 中的附加属性

javascript - 如何计算 JSON 集合中的所有重复值?

javascript - 仅在滚动时播放循环的 css 动画 - 滚动停止时停止

jquery - 在 c3 圆环图中设置起点

javascript - 返回延迟对象的链接函数

c# - 如何覆盖 express js 默认的 Keep Alive 行为

javascript - 如何在 JavaScript 中为函数添加时间延迟?

php - 带有 '+' 符号的 Jquery ajax 调用

jquery - 如何使用 TypeScript 和 jquery.d.ts 创建通用(无效)JQueryDeferred 对象