2017-04-26 56 views
0

我試圖從一個承諾傳遞一個結果(數組)到迭代這個結果的函數,爲每個項目獲取請求並創建一個新的對象與結果之前返回它。問題在於在解決承諾並填充之前返回對象。什麼是從多個承諾中返回填充對象的正確方法?角度循環承諾 - 函數返回空對象

function getPackageDetails(packages) { 
    var detailedPackages = {}; 
    angular.forEach(packages, function(p) { 
    vsmsPackageFactory.getPackage(p.id) 
    .then(function(response) { 
     var subsystem = response.data.packageManifest.subsystem; 
     var partNumber = response.data.packageManifest.resultConfig.partNumber; 
     var packageName = response.data.packageMetaData.packageName; 
     if(detailedPackages[subsystem] === undefined) { 
     detailedPackages[subsystem] = {}; 
     } 
     if(detailedPackages[subsystem][partNumber] === undefined) { 
     detailedPackages[subsystem][partNumber] = {}; 
     } 
     detailedPackages[subsystem][partNumber][packageName] = response.data; 
    }); 
    }); 
    return detailedPackages; // returns before all promises resolved 
} 

vsmsCampaignFactory.getCampaignPackages(queryString) 
.then(function(response) { 
    vm.packageList = getPackageDetails(response.results); 
}); 

回答

2

您應該考慮使用$q.all這種情況下,你可以收集起來承諾單一陣列中的所有承諾,然後通過它在$q.all &返回結果的承諾。它將確保您在所有承諾完成後返回data

在你的代碼中,你只是執行你的異步ajax調用而不用擔心它們是否完成。之後,您將返回detailedPackages數據。但顯而易見,它將是空的。

代碼

function getPackageDetails(packages) { 
    var detailedPackages = {}; 
    var promises = []; //promise array 
    angular.forEach(packages, function(p) { 

    var promise = vsmsPackageFactory.getPackage(p.id) 
    .then(function(response) { 
     var subsystem = response.data.packageManifest.subsystem; 
     var partNumber = response.data.packageManifest.resultConfig.partNumber; 
     var packageName = response.data.packageMetaData.packageName; 
     if(detailedPackages[subsystem] === undefined) { 
     detailedPackages[subsystem] = {}; 
     } 
     if(detailedPackages[subsystem][partNumber] === undefined) { 
     detailedPackages[subsystem][partNumber] = {}; 
     } 
     detailedPackages[subsystem][partNumber][packageName] = response.data; 
    }); 
    promises.push(promise); 
    }); 
    return $q.all(promises).then(function(){ 
    return detailedPackages; // returned data after all promises are done 
    }); 
} 
+0

承諾對我來說仍然有點令人困惑,感謝您的幫助。 – neridaj

1

這可能是achive使用承諾所有,here

var promises = []; 
promises.push(new Promise(function (resolve, reject) { 
    vsmsPackageFactory.getPackage(p.id) 
    .then(function(response) { 
    ... 
    resolve('If you want to return something') 
    }); 
}); 
//After the loop it's finished you execute your promises 
Promise.all(promises).then(function (values) { 
    ... perform more code 
}); 
+0

感謝您的幫助。 – neridaj