2014-09-04 3 views
5

그래서 배열의 각 메서드에 대한 약속을 반환하는 메서드를 호출하는 angularjs 서버에 메서드가 있습니다. 밑줄 _each를 사용하여 배열을 반복합니다. 내가 .. 루프가 완료 물론이 작동하지 않습니다 .. 내가 방법에서 코드의 마지막 줄을 호출하기 전에 전체 배열이 처리 될 때까지 기다려야

그래서 ...

function ProcessCoolStuff(coolStuffs) 
{ 
var stuff = []; 
_.each(coolStuffs, function(coolStuff) 
{ 
    //Some method using $q to return 
    makeStuffCooler(coolStuff).then(function(coolerStuff) 
    { 
    stuff.push(coolerStuff); 
    }); 
}); 
//Maybe Call a Display Method, or call event ect.. 
ShowAllMyCoolStuff(stuff); 
} 

원하는 makeStuffCooler가 각 항목에 대해 완료되기 전에 'ShowAllMyCoolStuff'를 호출합니다. 그래서 ... 내 ShowAllMyCoolStuff 메서드는 컬렉션이 채워질 때까지 기다릴 것이다 그래서 비동기 메서드와 상호 작용하는 올바른 방법은 무엇입니까? 이것은 일반적으로 $ q와 약속에 대한 나의 경험 부족 일지 모르지만, 나는 붙어있다. 미리 감사드립니다.

+0

그래, $의 q.all입니다 에서. – pfooti

답변

8

약속을 취하는 $q.all을 사용하고 싶습니다. 그러므로 each 대신 map을 사용하고 그 결과를 $q.all()으로 전달하면 모든 것을 기다릴 수 있습니다. 수동으로 채워지는 배열 인 stuff이 필요하지 않지만, 단지 새로운 약속의 해상도 값을 사용할 수 있습니다.

function processCoolStuff(coolStuffs) { 
    return $q.all(_.map(coolStuffs, makeStuffCooler)); 
} 
processCoolStuff(…).then(showAllMyCoolStuff); 
+2

니스, 고마워. 그게 내가 필요로하는 것입니다 .. 나는 $ q.all과 관련이 있다고 생각했습니다. 또한 수동으로 채워진 배열을 제거하는 것에 +1. –

0
$q.all([promise1,promise2,promise3,etc]) 
.then(function(results){ 
    alert("This alert will happen after all promises are resolved."); 
}) 
0

나는 질문과 답을 읽은 후에, 나는 올바른 길을 가고있다. 지금까지 감사드립니다! 그러나 최종 작업 해결을 위해 모든 유스 케이스가 작동하도록 한 시간을 보냈습니다. 그렇기 때문에 결단을 기다리는 일련의 약속을 포함하여 일련의 약속이 포함 된 코드 예제를 공유하고자합니다.

사용 사례 배경은 업로드 후 서버 측 (nodeJs) 파일 가져 오기입니다. 적절한 http 상태와 결과를 반환하기 위해 약속을 사용했습니다.

readFile: function (fileName) { 
    if (fileName) { 
     var deferred = Q.defer(); 
     var self = this; 
     converter({input: fileName}, function (error, userData) { 
      if (error) { 
       deferred.reject(error); 
      } 
      self.storeUsers(error, userData) 
       .then(function (success) { 
        if (success) { 
         deferred.resolve(success) 
        } 
       }) 
       .fail(function (error) {      
        deferred.reject(error)      
       }); 
     }); 
     return deferred.promise; 
    } 
}, 

storeUsers: function (error, data) { 
    return Q.all(_.map(data, function (users, emailAddress) { 
     var deferred = Q.defer(); 
     userRepository.findUserByEmail(emailAddress, function (user) { 
      //... 
      user.save(function (error) { 
       if (error) { 
        deferred.reject(error); 
       } else { 
        deferred.resolve(emailAddress); 
       } 
      }); 

     }); 
     return deferred.promise; 
    })); 
} 

희망도 있습니다. 그것은 어디

건배 벤

브라우저가 각 실행중인 경우, 당신은 아마 Array.prototype.forEach 및 Array.prototype.map.But을 가지고에 의존 할 수 있음을 주목할 필요가