2017-09-17 10 views
0

$ q.all()을 사용하여 약속이 해결 될 때까지 기다리려고합니다. 이 목적을 위해 약속 배열을 만들고 all ​​() 메서드에 전달했지만이 방법은 작동하지 않습니다. 약속 배열은 각 반복에서 생성되는 $ resource 객체에 의해 반환 된 약속으로 채워져 있습니다. 약속 배열이 비동기 적으로 채워지기 때문에 문제가 있다고 생각합니다.

$ q.all() 메서드가 반환하는 약속, 약속 배열은 항상 빈 배열이므로이 결론에 도달했습니다. 그것은 $ q.all() 메소드가 배열이 채워지는 것을 기다리지 않는 것과 같습니다. 그러나 그것이 문제인지 확실하지 않습니다.

$ q.all()을 사용하여 원하는 것을 얻을 수 없다면 정말 도움이 될 것입니다. 모든 약속이 해결 된 후에 다른 방법으로 코드를 실행하고 싶습니다. 여기

내가 현재 약속의 .then 방법은 데이터가 반환에서 새 약속을 반환

 var promisesArray = [];    
     var images, postObject; 
     files.readFile('images.txt') 
     .then(function (data) { 
      images= angular.fromJson(data);     
      images.forEach(function (image, idx) { 
       var deferred = $q.defer();      
       if (!image.sent) { 
        files.readFile(image.name) 
        .then(function (data) { 
         postObject = angular.fromJson(data); 
         $resource(EndPointsService.baseURL + "images").save(postObject, function(data) { 
          deferred.resolve(data); 
          if (data.status) {          
           image.sent= true;          
          } 
         },function(error){ 
          console.log(error); 
         }); 
         promisesArray.push(deferred.promise); 
        },function(error){ 
         console.log(error); 
        }); 
       } 
      }); 


       $q.all(promisesArray).then(function (data) { 
        console.log(data); 
        files.writeFile("images.txt", images) 
        .then(function (data) {       
         console.log(data); 
        }, function (error) { 
         console.log(error); 
        }); 
       }); 
     },function(error){ 
      console.log(error) 
     }); 
+0

당신은 비동기'readFile' 통화 이외의 약속 배열에 약속을 밀어해야합니다

.then 방법 및 return 안에 그 .then 방법에 $q.all 약속을 약속 배열 을 만듭니다. 위의 지연을 만들었으므로 배열에 추가 할 수 있습니다. – anson

+0

내가 "그걸 잘 놓아야한다"고 말할 때, 다음 줄에 지연 선언이 나온다는 뜻인가요? –

+0

글쎄, 기술적으로 당신은 if 서술문 위에 연기했다. 따라서 조건이 거짓이면 아무 이유없이 지연을 생성했습니다. 지연된 생성과 추가를 조건문 안의 배열에 넣어야합니다. – anson

답변

1

을 사용하고있는 코드입니다.

̶v̶a̶r̶ ̶p̶r̶o̶m̶i̶s̶e̶s̶A̶r̶r̶a̶y̶ ̶=̶ ̶[̶]̶;̶    
var images, postObject; 
var arrayPromise = files.readFile('images.txt') 
    .then(function (data) { 
    ͟v͟a͟r͟ ͟p͟r͟o͟m͟i͟s͟e͟s͟A͟r͟r͟a͟y͟ ͟=͟ ͟[͟]͟;͟ 
    images= angular.fromJson(data);     
    images.forEach(function (image, idx) { 
     ̶v̶a̶r̶ ̶d̶e̶f̶e̶r̶r̶e̶d̶ ̶=̶ ̶$̶q̶.̶d̶e̶f̶e̶r̶(̶)̶;̶      
     if (!image.sent) { 
      var promise = files.readFile(image.name) 
       .then(function (data) { 
       postObject = angular.fromJson(data); 
       var url = EndPointsService.baseURL + "images" 
       ͟r͟e͟t͟u͟r͟n͟ $resource(url).save(postObject).$promise; 
      }); 
      promisesArray.push(promise); 
     }; 
    }); 
    ͟r͟e͟t͟u͟r͟n͟ $q.all(promisesArray); 
}); 


arrayPromise.then(function (dataArray) { 
    console.log(dataArray); 
    //Process data here 
}); 
+0

정말 고맙습니다. 내 문제를 완전히 해결했습니다. –

+0

도움이 된 것을 알면 다행입니다. 다른 사람들이 질문에 대한 답을 알 수 있도록 답변을 수락 된 것으로 표시하십시오. – georgeawg