无法让Angular-JS在继续之前等待异步调用

时间:2014-07-10 15:56:11

标签: javascript ajax angularjs

所以我知道你需要在Angular中使用promises来管理异步,但是我不太确定如何在这个实例中做到这一点。

function getLineGraphData(promises){
    var points = [];
    for (var i = 0; i < promises.length; i++) {
        $http.get('/file/tsDataPoints/'+promises[i].unit+"?startDate="+promises[i].startTs+"&endDate="+promises[i].endTs+"&startState="+promises[i].startState+"&endState="+promises[i].endState).success(function(data){
            points.push(data);
            console.log(data);
        });
    }
    console.log(points);
    return points;
}

我认为在这里抛弃我的是我用于构建查询的数据是在一个数组中。所以我不需要从一个请求中获得回报。会有好几个。我需要做什么?例子会有所帮助。感谢。

1 个答案:

答案 0 :(得分:3)

$ http返回一个承诺。当所有这些都被解析时,$ q.all会接受一系列承诺和解析。所以有可能:

promises = promises.map(function(promise){
    return $http.get('/file/tsDataPoints/'+promise.unit+"?startDate="+promise.startTs+"&endDate="+promise.endTs+"&startState="+promise.startState+"&endState="+promise.endState);
});

$q.all(promises).then(function(resultsArray){
    console.log(resultsArray); // array of results of all your $http's
});

<强> UPD:
如果你需要从你的函数中返回,你可以

function getLineGraphData(promises){
    promises = promises.map(function(promise){
        return $http.get('/file/tsDataPoints/'+promise.unit+"?startDate="+promise.startTs+"&endDate="+promise.endTs+"&startState="+promise.startState+"&endState="+promise.endState);
    });        
    return $q.all(promises);
}

并称之为

getLineGraphData(promisesArr).then(function(resultsArray){ 
    // do your stuff
});