2016-09-28 2 views
-1

내 AngularJS 앱에서 나는 Service과 복수 controllers을 동시에 실행합니다. 앱은 서버 (JSON 형식)의 데이터 업데이트를 각도 Service으로받습니다. 서버에서이 데이터를 대기열에 두어야합니다 (데이터가 방대한만큼). 일부 처리 서비스는 서비스에 등록 된 컨트롤러 콜백을 사용하여이 데이터를 모든 컨트롤러에 전송해야합니다. 컨트롤러는이 데이터를 추가로 처리합니다.AngularJS 사용 방법 데이터 대기열 처리를위한 약속

난 JSON 오브젝트의 큐 이하 가지고

In ----> [Obj1] - [Obj2] - [Obj3] - [Obj4] ---> OUT 

입력 동작은 비동기이며, 매초 (큐 또한 비어 될 수 있음) 큐에 추가하기 오브젝트의 'N'수가있다.

한 번에 하나의 항목을 팝업 한 다음 수신 된 JSON 데이터를 처리해야하는데이 프로세스는 대기열의 마지막 항목까지 계속됩니다. 또한 새 항목이 대기열에 추가 될 때 처리됩니다.

일부 게시물에서 AngularJS Promise를 사용하여이 작업을 수행 할 수 있음을 알게되었지만 완전히 새로운 Angular이므로 구현 방법을 이해할 수 없습니다.

또한 몇 가지 예에서이 var deferred = $q.defer();를 사용하는 언급, 그래서 어떻게 $q을 사용하고 $qPromise의 차이는 무엇인가?

이 기능을 구현하는 다른 "간단한"방법이 있습니까?

예제 코드 :

angular.module('myApp') 
.service('DataService', ['$rootScope', 'UpdateService', function($rootScope, UpdateService) 
{ 
    // To store array of JSON updates  
    var arrayOfUpdates = []; 

    // To store callbacks to which we need to send updates after processing 
    var arrayofCallbacks = []; 

    // Method is getting called when there are updates from "UpdateService" server 
    this.onDataUpdated = function (jsonObj) 
    { 
     // This will add this object in the array 
     arrayOfUpdates.unshift(jsonObj); 
    } 

    // This method will process data and send it further 
    function processData() 
    { 
     // Get the last element from the array 
     var jsonObj = arrayOfUpdates.pop(); 

     // Now process this JSON data - this method takes time 400-500 MS 
     var data = doSomeCalculations(jsonObj); 

     // There can be 10-20 callbacks at a time -- This also takes time 
     for(var index=0;index<arrayofCallbacks.length;index++) 
     { 
       var object = arrayofCallbacks[index]; 
       object.onUpdatedData(data); 
     }  

     // After processing this item 
     // Pop next element and process and send to registered callbacks 
     // I can not call "processData()" again as it can create loop 
     // Also calling it after interval (using $interval) might call it when it has not completed processing 
    } 
}); 

답변

1

당신은 각 이벤트에 볼 수 있었다. Working with $scope.$emit and $scope.$on.

모든 컨트롤러를 구독하면 데이터 처리 후 모든 컨트롤러가 처리 할 이벤트가 게시됩니다.

+0

예 $ emit 및 $ on을 사용하여 서비스에서 컨트롤러로 이벤트를 보내고받을 수 있습니다. 그러나 더 나은 구현 방법이 있습니까? 또한 얼마나 효율적인 배출이 있는지는 누락/건너 뛰기와 이벤트의 기회가있을 것입니다. 매 초마다 서비스가 보내야 할 이벤트가 많기 때문입니다. – User7723337

+0

누락 또는 건너 뛰기의 실제 변화가 없습니다. 그리고 내가 당신의 요구 사항을 모르기 때문에 더 좋은 방법이라고 말할 수있는 방법이 없습니다. 더 빠르고, 덜 복잡하고, 코드 라인이 더 정비 가능하고, 더 읽기 쉽다는 것을 의미합니까? 또한 stackoverflow에서 허용되지 않는 의견을 기반으로하는 것이 더 나은 것에 대한 답을 얻지 못할 것입니다. –

+0

내 의견으로는 콜백 목록을 직접 작성하지 않아도되므로 이벤트를 사용하는 것이 좋습니다. 그것은 각도로 처리됩니다. –