나는 비슷한 것을 보았을 것입니다. 아마도 도움이 될 것입니다.
전체 트리를 나타내는 개체를 만들기 위해 AJAX 호출을 통해 트리를 작업해야했습니다. 내가 AJAX 호출을 만들었을 때 자식 노드에 대한 데이터를 얻을 수 있었고, 그 데이터를 얻기 위해 AJAX 호출을해야했습니다. 렌더링하기 전에 전체 트리를 가져야 했으므로 언제 완료되었는지를 알아야했습니다.
$ q.all의 문제점은 예를 들어 약속 배열을 전달할 수 있지만 나중에 배열에 약속을 추가하더라도 그 시점에서 배열이 고정된다는 것입니다.
해결되지 않은 요청의 수를 추적하고 미결 된 요청이있는 경우 $ q.all을 다시 실행하는 것이 내 (틀림없이 해킹)입니다.
var promisesArr = [];
var unresolved = 0;
function getChildNodes(node) {
var url = BASE_URL + '/' + node.id;
var prom = $q(function (resolve, reject) {
unresolved++;
$http.get(url).then(function (resp) {
angular.forEach(resp.data.children, function(v){
var newNode = {};
newNode.id = v.id;
getChildNodes(newNode);
node.children.push(newNode);
});
resolve();
unresolved--;
}, function() {
// Need to handle error here
console.log('ERROR');
reject();
unresolved--;
})
});
promisesArr.push(prom);
}
rootNode = {id: 1}
getChildNodes(rootNode);
allResolved();
function allResolved() {
if (unresolved > 0) {
$q.all(promisesArr).then(allResolved);
} else {
RenderTree(rootNode);
}
}
([어떻게 내 이후 체인 여러 약속을 A의 루프에 각 $ q를]의
가능한 중복 http://stackoverflow.com/questions/21024411/angular-q-how-to-chain- 루프 내에서 복수 약속) – theodor
아니야! 질문을주의 깊게 읽으십시오. –