2017-04-17 6 views
0

私は約束を私の$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

また、FYIのネイティブ(またはポリ充てん)プロミスを使用すると、コードが(私の見解では)クリーナーにさえなります - https://jsfiddle.net/b82z1fnz/ –

答えて

0

$.eachは、あなたの代わりに約束の最初の引数に渡す配列を返します。

私は右のあなたの質問を取得する場合、あなたはこのような何かをしたいと思うかもしれませんが...

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の後にそれを解決する。

+0

完璧に機能します。ありがとう – Spyder

関連する問題