2016-09-28 22 views
-1

私のAngularJSアプリでは、私はServiceと複数のcontrollersを同時に実行しています。アプリケーションは、サーバからのデータ更新を角度(Service)で(JSON形式で)受け取ります。私はこのデータをサーバにキューイングする必要があります(データが膨大であるため)。そして、処理サービスがサービスで登録されたコントローラコールバックを使用してこのデータをすべてのコントローラに送る必要があります。コントローラはこのデータをさらに処理します。AngularJSデータキューの処理にPromiseを使用する方法

私はJSONオブジェクトのキューの下にあります

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

入力操作が非同期であり、毎秒(キューも空になることができます)、キューに追加取得するオブジェクトの「n」の数があります。

一度に1つのアイテムをポップしてから、受信した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を使用して、サービスからコントローラへのイベントを送受信できます。しかし、より良い実装方法がありますか?どのくらい効率的な放出があるかはまた、2番目毎のサービスが送る必要のあるイベントがたくさんあるので、行方不明/スキップやイベントの可能性があります。 – User7723337

+0

欠落またはスキップの現実的な変化はありません。私はあなたの要件を知らないので、より良い方法であると言う方法はありません。より速く、複雑さの少ないコード行、より保守性の高い/読みやすいコードを意味しますか? また、おそらく、stackoverflowで許可されていない主に意見ベースであるため、何が良いかについての回答は得られません。 –

+0

あなたのコールバックのリストを自分で保持する必要がないので、私の議論ではイベントを使用する方が良いです。それは角度で処理されます。 –

関連する問題