2017-11-14 1 views
-1

필자는 백엔드 데이터에서 가져올 약속을 작성합니다. 하지만 function end()에는 내 변수 마녀가이 데이터를 포함하고 있지 않습니다. 내가 뭘 잘못하고, overlappingProjects 변수를 반환하는 방법?내 변수가 AngularJS 약속 범위 내에서 사용 가능하지 않은 이유는 무엇입니까?

Console.log (1 및 2)는 데이터가 많지만 console.log (4)에는 이미 빈 개체가 있습니다.

this.checkSingleInvitation = function(invitation) { 
    console.log('Оверлап сингл'); 
    var dtoArray = []; 
    var overlappingProjects = {}; 

    InvitationService.acceptedProjects.models.forEach(function(accepted) { 
     if(!(dateHelper.parseDate(accepted.dt_from) > dateHelper.parseDate(invitation.dt_to) || dateHelper.parseDate(accepted.dt_to) < dateHelper.parseDate(invitation.dt_from))) { 
      var dto = { 
       target: invitation.project_has_musicians_id, 
       goal: accepted.project_id 
      }; 
      dtoArray.push(dto); 
     } 
    }); 

    var promises = []; 
    angular.forEach(dtoArray, (function(dto) { 
     var deferred = $q.defer(); 
     var overlappingProjects = {}; 
     //async fun 
     InvitationService.checkOverlapping(dto) 
      .before(function() { 
       progressBars.progressbar.requestsInProgress++; 
      }) 
      .success(function(data) { 
       // TODO: overlappingProjects - ??? 
       if(Object.keys(data).length) { 
        console.log('1'); 
        console.log(data); 
        overlappingProjects = data; 
        console.log(overlappingProjects); 
       } 
       console.log('2'); 
       console.log(data); 
       deferred.resolve(data); 
      }) 
      .error(function(error) { 
       deferred.reject(error); 
      }) 
      .finally(function() { 
       progressBars.progressbar.requestsInProgress--; 
      }); 
     promises.push(deferred.promise); 
    })); 
    $q.all(promises).then(console.log(promises)).then(
     end() 
    ); 

    function end() { 
     console.log('4'); 
     console.log(overlappingProjects); 
     return overlappingProjects; 
    } 
} 
+0

'Invitatio nService.checkOverlapping (dto)'를 약속 배열에 추가합니다. 그리고 '모든 것'으로 해결할 때까지 기다리십시오. – yBrodsky

답변

0
( overlappingProjects) 선언, 두 번 변수 end 함수를 호출하는 것이 아니라, 즉시 콜백로 전달 외에도

:

$q.all(promises).then(console.log(promises)).then(
    end() 
); 

가되어야한다

두 번째 정의를 제거
$q.all(promises) 
    .then(() => console.log(promises)) // may be .then(results => console.log(results)) ? 
    .then(end); 
1

문제는 사용자가 overlappingProjects을 두 번 정의하는 것으로 보입니다.

angular.forEach(dtoArray, (function(dto) { 
     var deferred = $q.defer(); 
     var overlappingProjects = {}; // <-- remove this line 
관련 문제