我在向$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)
})
答案 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
完成后解决它。