AngularJS如何使用Promise处理数据队列

时间:2016-09-28 09:23:45

标签: javascript angularjs angular-promise

在我的AngularJS应用中,我一次运行Service和多个controllers。应用程序在Angular Service中从服务器(以JSON的形式)接收数据更新。我需要在服务器中排队这些数据(因为数据量很大),然后在一些处理服务需要使用服务注册的控制器回调将这些数据发送到所有控制器。控制器进一步处理这些数据。

我有JSON对象的队列:

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

Input操作是异步的,每秒在队列中添加“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 个答案:

答案 0 :(得分:1)

您可以查看角度事件。 Working with $scope.$emit and $scope.$on

在每个控制器中订阅并在处理完数据后发布一个所有控制器都将处理的事件。