2015-01-16 4 views
0

나는 $ q.all을 사용할 때의 약속을 해결하는 데 어려움을 겪고 있습니다.

내가 한 약속이있을 때, 다음 괜찮 았는데했습니다

var dashlettePromise = DashboardsDataService.getTabDetails(dashboardData); 
    dashlettePromise.then(function(data) { 
     var template = '<div class= "allChartsDiv">'; 

     for (var dashVar = 0; dashVar < data.tabDetails.length; dashVar++) { 
     var dashletteId = data.tabDetails[dashVar].dashletteId; // Added 
     .... 
     } 
    }, function(error) { 
     alert(error); 
    }, function(progress) { 
     // report progress 
    }); 

그러나 아래 그림과 같이 여러 개의 아약스는 내가 사용하고 $의 q.all를 호출 할 필요가 :

var promises = []; 
angular.forEach(dashboardslayoutArray, function(dashboardslayout) { 
    dashboardData.dashletteBeansList = []; 
    dashboardData.dashletteBeansList[0] = dashboardslayout; 
    var dashlettePromise = DashboardsDataService.getTabDetails(dashboardData); 
    promises.push(dashlettePromise); 

}); 

이제 나는 위의 그림과 같이 단일 약속을 위해 결정한 약속과 똑같은 $ q.all의 모든 약속을 하나씩 해결해야합니다. 그래서 아래 코드를 사용했지만 예상대로 작동하지 않습니다. 약속을 해결하기 위해 $ q.all (약속) 내부에서 사용하고있는 논리에 의문이 생깁니다. 올바른 접근인가? 또는 $ q.all에서 약속을 해결할 더 좋은 방법을 제안 할 수 있습니까?

$q.all(promises) 
    .then(function(allData) { 
    // all promises were resolved here       
    angular.forEach(promises, function(eachPromise) { 

     eachPromise.then(function(data) { 

     for (var dashVar = 0; dashVar < data.tabDetails.length; dashVar++) { 
      var dashletteId = data.tabDetails[dashVar].dashletteId; // Added 
      var axisType = data.tabDetails[dashVar].axisType; 
      ..... 
     } 

     }, function(error) { 
     alert(error); 
     }) 

    }) 

    }); 
+0

첫 번째 루프는 쓸모가 없습니다. 모든 데이터가 이미'allData' 배열에 있으므로'then()'함수에서'promises'를 명시 적으로 참조하고 싶지는 않습니다. 내가 충분히 명확한 지 모르겠다. – Blackhole

+0

@Blackhole이 말한 것과 또한 ... '$ q.all'에 대해 물어 보려는 모든 코드를 정말로 볼 필요가 있습니까? –

+0

then() 함수 안에 angular.forEach (allData, function (data) {...})와 같은 것을 수행하길 원하십니까? – smart987

답변

1

문제는 $q.all가 해결 된 상태에서 약속 자체를 돌려주는 것이 아니라 직접 값을 반환하지 않습니다. 따라서 $q.all 호출 내에서 약속을 얻으려고해도 값을 얻는 것입니다. 이것을 피하기 위해 당신은 종결시 약속을 지킵니다.

하는 대신 .all 전화 내부의 약속의 값을 처리하는 코드를 조정 해보십시오 :

$q.all(promises) 
    .then(function(allData) { 
    // all promises were resolved here       
    allData.forEach(function(data) { 
    // no `then` needed here 
     for (var dashVar = 0; dashVar < data.tabDetails.length; dashVar++) { 
      var dashletteId = data.tabDetails[dashVar].dashletteId; // Added 
      var axisType = data.tabDetails[dashVar].axisType; 
      ..... 
     } 
    }); 
}); 

그래서 일반적으로 당신의 접근 방식은 (좋은 일을) 작동 -하지만 할 수 있습니다 더 나은 :)

또한 진행 상황은 피해야하며 미래의 증거는 아님을주의하십시오.

+0

나는 대답을 수락하고 있지만 "일반적으로 당신의 접근 방식은 훌륭하게 작동한다. 그러나 더 나을 수있다"는 의견에 반향하고 싶다. 이 경우 나에게 제안 할 수있는 더 나은 옵션은 무엇입니까? – smart987

+0

질문이 하나 더 있습니다. 대기열에있는 모든 약속을 수집하고 해결하는 데 지연을 피할 수있는 가능성이 있습니다. 곧 약속이 가능 해지면 그곳에서 해결하고자합니다. 관련 질문은 stackoverflow.com/questions/27960174/how-to-minimize-the-delays-in-collecting-all-promises-in-angular-js?noredirect=1#comment44314227_27960174에서 확인할 수 있습니다. 거기에 어떤 해결책이 있습니까? – smart987

+0

@mnkb (.all에 들어있는) 질문에서 얻은 접근 방식은 작동합니다.하지만 응답에서 증명할 필요가없는 접근 방식은이를 필요로하지 않습니다 (따라서 더 좋습니다). 나는 당신의 다른 질문을 살펴볼 것입니다. –

관련 문제