2015-01-16 112 views
0

我正面臨解決使用$ q.all的承諾的問題,任何人都可以幫助我嗎?

當我有一個承諾,下面已經工作得很好:

var dashlettePromise = DashboardsDataService.getTabDetails(dashboardData); 
    dashlettePromise.then(function(data) { 
     var template = '<div class= "allChartsDiv">'; 

     for (var dashVar = 0; dashVar < data.tabDetails.length; dashVar++) { 
     var dashletteId = data.tabDetails[dashVar].dashletteId; // Added 
     .... 
     } 
    }, function(error) { 
     alert(error); 
    }, function(progress) { 
     // report progress 
    }); 

但我需要讓多個Ajax調用,所以我使用了$ q.all如下圖所示:

var promises = []; 
angular.forEach(dashboardslayoutArray, function(dashboardslayout) { 
    dashboardData.dashletteBeansList = []; 
    dashboardData.dashletteBeansList[0] = dashboardslayout; 
    var dashlettePromise = DashboardsDataService.getTabDetails(dashboardData); 
    promises.push(dashlettePromise); 

}); 

現在我需要逐個解決$ q.all中的所有承諾,就像我上面解釋的單個承諾一樣。所以我使用了下面顯示的代碼,但它沒有按預期工作。我懷疑我在$ q.all(promise)中使用的邏輯來解決承諾。這是正確的方法嗎?或者任何一個人能否提出更好的方法來解決$ q.all中的承諾?

$q.all(promises) 
    .then(function(allData) { 
    // all promises were resolved here       
    angular.forEach(promises, function(eachPromise) { 

     eachPromise.then(function(data) { 

     for (var dashVar = 0; dashVar < data.tabDetails.length; dashVar++) { 
      var dashletteId = data.tabDetails[dashVar].dashletteId; // Added 
      var axisType = data.tabDetails[dashVar].axisType; 
      ..... 
     } 

     }, function(error) { 
     alert(error); 
     }) 

    }) 

    }); 
+0

您的第一個循環沒用:因爲您已經擁有了allData數組中的所有數據,所以您不應該在'then()'函數內明確引用'promises'。不知道我是否足夠清楚。 – Blackhole

+0

@Blackhole說了些什麼,還有......我們是否真的需要查看您發佈的所有代碼以詢問'$ q.all'? –

+0

你想讓我做一些像angular.forEach(allData,function(data){...})在then()函數中嗎? – smart987

回答

1

的問題是,$q.all不返回的承諾自己在解決國家,而是直接返回自己的價值。因此,儘管您希望在$q.all調用中獲得承諾,但您仍可以獲得這些值。爲了規避這種情況,你可以訪問關閉中的承諾。

嘗試調整你的代碼來處理的值,而不是.all調用內部的承諾:

$q.all(promises) 
    .then(function(allData) { 
    // all promises were resolved here       
    allData.forEach(function(data) { 
    // no `then` needed here 
     for (var dashVar = 0; dashVar < data.tabDetails.length; dashVar++) { 
      var dashletteId = data.tabDetails[dashVar].dashletteId; // Added 
      var axisType = data.tabDetails[dashVar].axisType; 
      ..... 
     } 
    }); 
}); 

所以一般的方法效果(好) - 但可以更好:)

另外請注意,應該避免進度事件,並且不能作爲未來的證據。

+0

我接受了答案,但希望迴應你的評論,「所以一般而言,你的方法可行(做得好) - 但可以做得更好」。在這種情況下,你會向我提出什麼更好的選擇? – smart987

+0

我還有一個問題,是否有可能避免拖延收集隊列中的所有承諾,然後解決。很快承諾可用,我想在那裏解決。相關問題可以在stackoverflow.com/questions/27960174/how-to-minimize-the-delays-in-collecting-all-promises-in-angular-js?noredirect=1#comment44314227_27960174找到。有沒有解決方案? – smart987

+0

@mnkb你在問題中的方法(之後在.all中)有效 - 但不需要在答案中演示的方法不需要(因此它更好)。我會看看你的其他問題。 –