2014-06-06 4 views
0

함수의 다음 호출에 대한 매개 변수를 제공하는 비동기 함수 (루프)를 호출하는 함수가 있습니다. 나는 코드를 작성하는 것이 더 의미가 있다고 생각한다. 그래서 내가 시도한 것은 성공했다. 이 주제에 관해 많은 질문을했지만 실제로 본 모든 것을 시도했습니다. 각 removeAttachment()에 대한 새로운 rev을 필요로하기 때문에AngularJS - 지연된 재귀 약속

removeMultipleAttachments: function(docid, rev, attachmentIDs) { 
     var requests = []; 
     var deferred = $q.defer(); 
     var p = $q.when(); 
     console.log(attachmentIDs); 
     angular.forEach(attachmentIDs, function(file, index) { 
      p = p.then(function (formerRes) { 

       return pouch.removeAttachment(docid, attachmentIDs[index].name, rev, function (err, res) { 
        $rootScope.$apply(function() { 
         if (err) { 
          deferred.reject(err); 
         } else { 
          rev = res.rev; 
          console.log(rev); 
          deferred.resolve(res); 
         } 
        }) 
       }); 
      }); 
      requests.push(p); 
     }) 
     $q.all(requests).then(function(){ 
      console.log('DONE'); 
     }); 

     return deferred.promise; 
    } 
+0

우선이다 var p = $ q.when(); 은 이어야합니다. var p = $ q.defer(); – DrDyne

+0

첨부 파일을 순서대로 제거해야하나요, 아니면 주문에 신경 쓰지 않습니까? –

+0

괜찮 으면()을 약속 안에 사용해야하지 않습니까? – ncohen

답변

0

, 당신은 $q.all()을 사용할 수 없습니다, 당신은 다음과 같이 then()를 사용하여 비동기 호출 순서를 확인해야합니다 : 내가 볼

removeMultipleAttachments: function(docid, rev, attachmentIDs) { 
    console.log(attachmentIDs); 
    var p = $q.when(); 
    angular.forEach(attachmentIDs, function(file, index) { 
     p = p.then(function (formerRes) { 
      var deferred = $q.defer(); 

      pouch.removeAttachment(docid, attachmentIDs[index].name, rev, function (err, res) { 
       if (err) { 
        deferred.reject(err); 
       } else { 
        rev = res.rev; 
        console.log(rev); 
        deferred.resolve(res); 
       } 
       $rootScope.$apply(); 
      }); 

      return deferred.promise; 
     }); 

    return p.then(function(res) { 
     console.log('DONE'); 
     return res; 
    }); 
} 
+0

감사합니다. 예, 내 문제 대부분을 해결하지만 모든 약속이 완료되면 어디에서 function 또는 console.log ('완료')를 추가 할 수 있습니까? – ncohen

+0

아 그리고 또한 마지막 응답을 잡아야합니다 ...이 함수를 다음과 같이 호출 할 수있게하려면 어떻게해야합니까 : removeMultipleAttachments (docid, rev, attachmentIDs) .then (function (response) {... 여기에서 응답을 catch하십시오. ...}) – ncohen

+0

@ncohen 내 대답이 업데이트되었습니다. –

관련 문제