$q.all 在 angularjs 中创建带循环的动态承诺

$q.all create dynamic promises with a loop in angularjs

我想做一个循环来包含我的第二个承诺,所以每次它通过我的循环时都会创建一个新的承诺:

var promise1 =   $http({
    method: 'GET',
    url: "https://cubber.zendesk.com/api/v2/organizations/"+id+"/users.json",
    dataType: 'json',
    headers: {'Content-Type': 'application/json',
    'Authorization': 'Bearer '+token}

});

var promise2 = promise1.then(function(data) {
    console.log(data);
    for(i = 0; i < data.data.users.length; i++){
            console.log(data.data.users.length);
        var userid = data.data.users[i].id;
            console.log(userid);

       return $http({
            method: 'GET',
            url: "https://cubber.zendesk.com/api/v2/users/"+userid+"/tickets/requested.json",
            dataType: 'json',
            headers: {'Content-Type': 'application/json',
                'Authorization': 'Bearer '+token}

        })
    }
});

$q.all([promise1, promise2]).then(function(data){
    console.log(data[0].data.users, data[1]);
});

在此代码中,循环不起作用,因为 promise2 只有 return 个结果。

你能帮我吗?

将您的代码更多地视为您想要触发的一系列事件。忘记同步 - 忘记逐行透视。

在本例中,我们触发了第一个 http 请求。然后,为了响应请求,我们发出了一堆 userid http 请求,并建立了一个返回的承诺的数组列表。

然后使用 $q.all,我们共同响应所有这些承诺,并做一个控制台日志。

var promise1 =   $http({
    method: 'GET',
    url: "https://cubber.zendesk.com/api/v2/organizations/"+id+"/users.json",
    dataType: 'json',
    headers: {'Content-Type': 'application/json',   'Authorization': 'Bearer '+token}

});

promise1.then(function(data) {
    var allQ = [];
    var allData = [];
    console.log(data);
    for(i = 0; i < data.data.users.length; i++){
            console.log(data.data.users.length);
        var userid = data.data.users[i].id;
            console.log(userid);

       allQ.push( $http({
            method: 'GET',
            url: "https://cubber.zendesk.com/api/v2/users/"+userid+"/tickets/requested.json",
            dataType: 'json',
            headers: {'Content-Type': 'application/json',
                'Authorization': 'Bearer '+token}

        }).then( function(data){ allData.push( data)} ) );
    }
    $q.all(allQ).then(function(data){
        //You will probably want to iterate allData
        console.log( allData);
    });
});