角度$ q.all使用多层角度重复

时间:2017-04-29 07:39:47

标签: angularjs promise

我有这段代码

var final=[];
$http.get('/Scenarios/List/'+ id).success(function(resp){
    angular.forEach(resp, function(value, key){
        var scenario ={};
        scenario.data=[];

        angular.forEach(value.samples, function(b, i){
            $http.get('/sample/One/'+ b.id).then(function(result){
                var id= result.temp_id;
                var temp ={};
                $http.get('/a/list/'+ id).then(function(result){
                    temp.a=result;
                });
                $http.get('/b/list/'+ id).then(function(result){
                    temp.b-resutl;
                });
                scenario.data.push(temp);
            })
        });

        final.push(scenario);

    });          

}); 

console.log(final); //no value

基本上当我试图得到一个" final"进一步解析的数据,我发现它是空的。我认为这个问题可能是由于缺少$ q.all的使用,但是我已经在网上查了很多教程,我无法弄清楚$ q.all的正确用法来解决我对angular.forEach的重复使用,在我的情况下, 那里有两个。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我想像这样解决它,使用$q.all是你在问题中正确提到的你所缺少的。

var final = [];

$http.get('/Scenarios/List/'+ id).success(function(resp){
    processSamples(resp).then(function(final) {
        console.log(final)
    })
});  

function processSamples(resp) {
    var deferred = $q.defer();
    angular.forEach(resp, function(value, key){
        var scenario = {};
        var promises = [];
        scenario.data = [];

        angular.forEach(value.samples, function(b, i){
            promises.push($http.get('/sample/One/'+ b.id));
        });

        $q.all(promises).then(function(result) {
            angular.forEach(result, function(res, index) {
                var id= res.temp_id;
                var temp = {};
                var childpromises = [];
                childpromises.push($http.get('/a/list/'+ id));
                childpromises.push($http.get('/b/list/'+ id));
                $q.all(childpromises).then(function(res) {
                    temp.a = res[0];
                    temp.b = res[1];
                    scenario.data.push(temp);
                    if(result.length === index + 1) {
                        final.push(scenario);
                        if(resp.length === key + 1) {
                            deferred.resolve(final);
                        }
                    }
                })
            })
        })
    });
    return deferred.promise;
}

注意一旦最上面的循环完成,它如何解析返回的promise。此外,由于没有提供可验证的示例,我可能会留下一些小错误,但至少应该给出一个好主意。