在$ q.all中解决Angularjs承诺的正确方法是什么

时间:2015-01-16 06:37:01

标签: angularjs promise angular-promise angular-services

我在解决使用$ 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(promises)中使用的逻辑来解决这些承诺。这是正确的方法吗?或者任何人都可以建议更好的方法来解决$ 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);
      })

    })

  });

1 个答案:

答案 0 :(得分: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;
            .....
        }
    });
});

所以一般来说你的方法有效(好工作) - 但可以更好:)

另请注意,应该避免进度事件,而不是将来的证据。