我对整个承诺事情有点新意,所以我可能会做一些非常错误的事情。如果有人可以启发我,欢迎所有建议/信息。
所以这里是我想要完成的代码(简化并且绝对不是理解目的的最佳选择):
// Get data from webservice
$scope.sendGet(id, option).then(function (response){
// Fill the model
$scope.model[option] = response.data;
}).then(function(){
if(option == $scope.PROFILES){
var p1 = new Promise((resolve, reject) => {
$scope.getX1($scope.model[option][0][0].id);
});
var p2 = new Promise((resolve, reject) => {
$scope.getX2($scope.model[option][0][0].id);
});
var p3 = new Promise((resolve, reject) => {
$scope.getX3($scope.model[option][0][0].id);
});
var p4 = new Promise((resolve, reject) => {
$scope.my_data = JSON.parse($scope.model[option][0][0].list);
});
// Execute all promises to get the data
Promise.all([p1,p2,p3,p4]).then(() => {
debugger;
// Do some validation and extra formatting on the data we just downloaded
$scope.update();
});
}
}).then(function(){
// Display the data to the user
$scope.move(option, 1, $scope.EDITING);
});
此处的预期行为是:
获取数据 - >使用此数据,使用id从4个来源获取数据(4个承诺) - >下载完所有数据后,更新一些参考文献并进行一些清理 - > move(这是一种更新视图并执行其他UI相关内容的方法)
但出于某种原因,debugger;
和$scope.update();
永远不会被执行。我尝试将它们移动到与$scope.move()
函数相同的。然后在执行Promise.all的数据之前执行。
答案 0 :(得分:1)
您永远不会解决承诺1-4,因此Promise.all(...).then
的“成功回调”永远不会触发。在给每个promise的构造函数的回调中,使用每个promise所获得的数据调用resolve
。
// ...
var p1 = new Promise((resolve, reject) => {
resolve($scope.getX1($scope.model[option][0][0].id));
});
// ...
这就是你从Promise“返回”数据的方式。有关详细信息,请参阅this article。
编辑:如果$scope.getX1
本身返回承诺,您可以简单地将其分配给p1
,即:
var p1 = $scope.getX1($scope.model[option][0][0].id);