在我的AngularJS应用中,我一次运行Service
和多个controllers
。应用程序在Angular Service
中从服务器(以JSON的形式)接收数据更新。我需要在服务器中排队这些数据(因为数据量很大),然后在一些处理服务需要使用服务注册的控制器回调将这些数据发送到所有控制器。控制器进一步处理这些数据。
我有JSON对象的队列:
In ----> [Obj1] - [Obj2] - [Obj3] - [Obj4] ---> OUT
Input操作是异步的,每秒在队列中添加“n”个对象(队列也可以变为空)。
我需要一次弹出一个项目,然后处理收到的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
}
});
答案 0 :(得分:1)
您可以查看角度事件。 Working with $scope.$emit and $scope.$on
在每个控制器中订阅并在处理完数据后发布一个所有控制器都将处理的事件。