Javascript 如何在我的每一美元上附加承诺

Javascript 如何在我的每一美元上附加承诺,javascript,jquery,promise,Javascript,Jquery,Promise,我在向我的$each循环附加承诺时遇到问题getTemplate是一个异步函数。我想在每个模板中输入所有模板,将它们收集到getAppsTmp变量中,并在下面插入它们。此时,之后的变量为空 var getAppsTmp var promise = $.each(addons, function (i, addon) { if (addon.isApp === true && addon.appLaunchUrl) { console

我在向我的
$each
循环附加承诺时遇到问题
getTemplate
是一个异步函数。我想在每个模板中输入所有模板,将它们收集到
getAppsTmp
变量中,并在下面插入它们。此时,之后的变量为空

var getAppsTmp
      var promise = $.each(addons, function (i, addon) {
        if (addon.isApp === true && addon.appLaunchUrl) {
          console.log(addon)
          var bestIcon = addon.icons.length - 1

          getTemplate('app-link', function (tmp) {
            getAppsTmp += tmp({
              appId: addon.id,
              appLaunch: addon.launchType,
              appName: addon.shortName,
              appUrl: addon.appLaunchUrl,
              appIcon: addon.icons[bestIcon].url
            })
          })
        }
      })
      $.when(promise).then(function () {
        $(modalId + ' .content').html(getAppsTmp)
      })
如果我这样做,一切都会正常,但我需要一次将它们全部追加:

getTemplate('app-link', function (tmp) {
    getAppsTmp = tmp({
    appId: addon.id,
    appLaunch: addon.launchType,
    appName: addon.shortName,
    appUrl: addon.appLaunchUrl,
    appIcon: addon.icons[bestIcon].url
    })
 $(modalId + ' .content').append(getAppsTmp)
})

$。每个
返回在第一个参数上传递的数组,而不是承诺

如果我没弄错你的问题,你可能会想这样做

var getAppsTmp = '',
    deferreds = [];

$.each(addons, function(i, addon) {
  if (addon.isApp === true && addon.appLaunchUrl) {
    console.log(addon)

    var bestIcon = addon.icons.length - 1,
        deferred = $.Deferred();

    getTemplate('app-link', function(tmp) {
      getAppsTmp += tmp({
        appId: addon.id,
        appLaunch: addon.launchType,
        appName: addon.shortName,
        appUrl: addon.appLaunchUrl,
        appIcon: addon.icons[bestIcon].url
      });

      deferred.resolve();
    });

    deferreds.push(deferred);
  }
});

$.when.apply(null, deferreds).then(function () {
  $(modalId + ' .content').html(getAppsTmp);
});

上面的代码基本上创建了对象,并将它们存储到一个数组中,用于
插件的每次迭代。然后在
getTemplate
完成后解决它。

正如供参考的那样,使用本机(或多填充)承诺会使代码(在我看来)更干净-