2017-04-17 1 views
0

Ich habe ein Problem, ein Versprechen an meine $each Schleife anzuhängen. getTemplate ist eine asynchrone Funktion. Ich möchte alle Vorlagen innerhalb jedes Feeds, sammeln sie in getAppsTmp Variable und fügen Sie sie unten ein. Im Moment ist die Variable danach leer.

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

wenn ich auf diese Weise alles funktioniert, aber ich brauche sie alle in einem Rutsch anhängen:

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

Genau wie ein FYI - mit nativen (oder polyfilled) Promises macht der Code (meiner Meinung nach) noch sauberer - https://jsfiddle.net/b82z1fnz/ –

Antwort

0

$.each gibt das Array, das Sie auf dem ersten Argument übergeben, anstatt ein Versprechen.

Wenn ich Ihre Frage richtig zu machen, könnte man so etwas wie dies tun wollen ..

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

Der Code oben im Grunde deferred Objekte erstellt und speichert sie in einem Array für jede Iteration von addons. dann um es zu lösen, nachdem getTemplate getan ist.

+0

Perfekt funktioniert es gut. Vielen Dank – Spyder