解析 $q.all 中的 Angularjs promises 的正确方法是什么
what is the right way of resolving the Angularjs promises inside $q.all
我在解决使用 $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);
})
})
});
问题是 $q.all
不是 return 处于已解决状态的承诺本身,而是 return 直接提供它们的价值。因此,尽管您希望在 $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;
.....
}
});
});
所以总的来说你的方法是有效的(干得好)——但可以做得更好:)
另请注意,进度事件可能应该避免并且不是未来的证明。
我在解决使用 $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);
})
})
});
问题是 $q.all
不是 return 处于已解决状态的承诺本身,而是 return 直接提供它们的价值。因此,尽管您希望在 $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;
.....
}
});
});
所以总的来说你的方法是有效的(干得好)——但可以做得更好:)
另请注意,进度事件可能应该避免并且不是未来的证明。