如何将承诺兑换成我的$ each

时间:2017-04-17 02:42:36

标签: javascript jquery promise

我在向$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)
})

1 个答案:

答案 0 :(得分:0)

$.each返回您在第一个参数而不是promise上传递的数组。

如果我的问题是对的,你可能会想做这样的事情......

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

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