私の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
を使用すると
$q
と
Promise
の違いは何ですか?
この機能を実装する他の「簡単な」方法もありますか?
例コード:
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
}
});
はい$ emitと$ onを使用して、サービスからコントローラへのイベントを送受信できます。しかし、より良い実装方法がありますか?どのくらい効率的な放出があるかはまた、2番目毎のサービスが送る必要のあるイベントがたくさんあるので、行方不明/スキップやイベントの可能性があります。 – User7723337
欠落またはスキップの現実的な変化はありません。私はあなたの要件を知らないので、より良い方法であると言う方法はありません。より速く、複雑さの少ないコード行、より保守性の高い/読みやすいコードを意味しますか? また、おそらく、stackoverflowで許可されていない主に意見ベースであるため、何が良いかについての回答は得られません。 –
あなたのコールバックのリストを自分で保持する必要がないので、私の議論ではイベントを使用する方が良いです。それは角度で処理されます。 –