Promise.all然后(js)

时间:2017-06-28 17:03:17

标签: javascript angularjs promise

我对整个承诺事情有点新意,所以我可能会做一些非常错误的事情。如果有人可以启发我,欢迎所有建议/信息。

所以这里是我想要完成的代码(简化并且绝对不是理解目的的最佳选择):

// 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的数据之前执行。

1 个答案:

答案 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);