javascript - 在触发单个函数之前等待所有 .then() 被执行

标签 javascript jquery ajax

<分区>

我正在尝试在加载所有模板后触发一个函数。这是通过每个模板的 loadTemplate 函数完成的。

我的问题是如何监听所有 .then() 完成,然后才触发我的 foo() 函数。

我试过使用 when() 和 promise,但是我没有成功地将它绑定(bind)到外部,虽然我设法将它绑定(bind)到 loadTemplate(这不是我想要的为)。

我总是可以将每个 loadTemplate 绑定(bind)到一个计数器,并在每次迭代时检查计数器是否已达到每个模板的数量,但我确信有一种更优雅的方法可以做到这一点。

这是循环代码:

    $.each(templates.hbs, function(idx, template) {
        loadTemplate(template.name)
          .then(function(templateStr){
            var compiledTemplate = Handlebars.compile(templateStr);
            if(template.isPartial){
              Handlebars.registerPartial(template.key, compiledTemplate);
            }
            templates[template.key] = compiledTemplate;
          });
      });

以及在之后触发的函数:

    function templateDone(){
      console.log("done!");
    }

感谢您的帮助!

编辑:也包括 loadTemplate 代码:

    function loadTemplate (template) {
      return new Promise(function (resolve, reject) {
        $.ajax({
          url: config.wwwroot + '/folder/' + template + '.hbs',
          async: false,
          success: function (result) {
            resolve(result);
          },
          error: reject
        });
      });
    }

最佳答案

当您的 loadTemplate 函数返回一个 promise 时,您可以使用 .when()。查看documentation等待多个 promise 被解决的例子。

你可以这样做:

var promises = [];

$.each(templates.hbs, function (idx, template) {
    promises.push(loadTemplate(template.name));
});

$.when.apply($, promises).then(templateDone);

至于您的 loadTemplate 函数,您不需要创建自己的 promise 。 $.ajax 默认返回一个 promise。

function loadTemplate(template) {
    return $.ajax({
        /* ... */
    });
}

看看这是否有所作为?也可以尝试不使用 async 属性。我不确定为什么这样可以解决问题,但值得一试。

关于javascript - 在触发单个函数之前等待所有 .then() 被执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33013123/

相关文章:

javascript - jsonp 和 POST 操作

jquery - 如何向模态添加完整标题?

javascript - 实现另一个要运行的函数 "onSongEnd"

Javascript : how to insert tags around a text selection?

javascript - PDF.js如何创建页面渲染事件?

javascript - 仅检测 mac 上的 firefox 用户

javascript - 获取缓存响应 - 无缓存 header 未按预期工作

javascript - 我可以通过ajax访问不同位置的同名 Controller 吗?

javascript - 在 mongoose 中使用 uuid 作为 objectID

javascript - 在 Jquery 中获取匹配的类