【发布时间】:2017-06-28 17:03:17
【问题描述】:
我对整个承诺的事情有点陌生,所以我可能做错了什么。如果有人可以启发我,欢迎所有建议/信息。
所以这是我想要完成的代码(简化且绝对不是最佳的理解目的):
// 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 个承诺)获取数据 -> 下载所有数据后,更新一些引用并进行一些清理 -> 移动(这是一种更新的方法视图并做一些与 UI 相关的其他事情)
但由于某种原因,debugger; 和 $scope.update(); 永远不会被执行。我尝试将这些移动到与 $scope.move() 函数相同的 .then 中,但它会在 Promise.all 中的数据被检索之前执行。
【问题讨论】:
-
你的 p1-p4 承诺永远不会完成,因为你没有在其中任何一个中调用
resolve()或reject() -
你永远不会解决你的承诺,因此他们永远不会执行
Promise.all的“完成”回调。您的每个承诺 (p1-p4) 都应该有一个resolve(value)或reject(value)。 -
虽然,我应该指出,因为你使用的是 angularjs,你应该使用
$q service。语法一模一样,基本上就是把“Promise”换成“$q”,去掉new关键字。 -
假设那些
get…方法返回承诺,你应该写var p1 = $scope.getX1($scope.model[option][0][0].id);等并省略任何new Promise调用。如果不是,它们实际上是异步的吗?你在这里甚至需要承诺吗?
标签: javascript angularjs promise