2014-07-09 3 views
4

기본적으로$q.all() 뒤에 배열을 약속을 더 밀어 넣을 수 있다는 것을 제외하고는 $q.all()과 같은 종류의 약속 큐를 만들려고합니다. 예를 들어 실행되었습니다.

더 잘 설명하기 위해 then()에 대한 코드를 실행하려는 단일 약속을 함수에 부여한다고 가정 해보십시오. 그러나이 첫 번째 약속이 해결되기를 기다리는 동안 함수에 대한 두 번째 약속을합니다. 이제는 then()이 모두 호출되기 전에 호출되는 것을 원하지 않습니다 ($q.all()과 유사). 두 번째가 제공되기 전에 첫 번째 약속이 완료되면 then() 함수가 두 번 호출됩니다. 이는 임의의 수의 약속에 대해 작동해야합니다.

기본적으로 대기열이 비워 질 때마다 (즉 현재 제공되는 모든 약속이 해결 된 경우) then() 번을 실행하는 약속 대기열로 끝납니다. 내가 할 수있는 좋은 방법을 알아낼 수있을거야, 그냥 마을에있는 사람이 이미 뭔가를 구현하는지 보거나, 내가 누락되었습니다 쉬운 옵션이 있습니다.

+0

가능한 중복 http://stackoverflow.com/questions/21024411/angular-q-how-to-chain- 루프 내에서 복수 약속) – theodor

+0

아니야! 질문을주의 깊게 읽으십시오. –

답변

0

나는 비슷한 것을 보았을 것입니다. 아마도 도움이 될 것입니다.

전체 트리를 나타내는 개체를 만들기 위해 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를]의