【问题标题】:AngularJS using ng-resource with multiple server polling methodsAngularJS 使用具有多种服务器轮询方法的 ng-resource
【发布时间】:2016-03-12 02:53:24
【问题描述】:

我正在使用基于这个答案的方法:Server polling with AngularJS

但是当我有多个轮询方法时如何设置此更新?

这是我的服务的 sn-p:

function pollingService($resource) {
    return {
        methodA: $resource(window.rootUrl + 'api/methodA', { para: '@para1' }, {
            query: { method: 'GET', params: {}, isArray: false }
        }),
        methodB: $resource(window.rootUrl + 'api/methodB', {}, {
            query: { method: 'GET', params: {}, isArray: false }
        })
    }
};

那么如何设置 tick 方法来轮询这 2 个方法并且只创建 1 个轮询循环?

(function tick() {
    $scope.method1 = pollingService.methodA.query(function () {
        $timeout(tick, $scope.refreshRate);
    });
    $scope.method2 = pollingService.methodB.query(function () {
        $timeout(tick, $scope.refreshRate);
    });
})();

【问题讨论】:

    标签: javascript angularjs ngresource


    【解决方案1】:

    你可以使用 promises $q.all 函数:

    var myTickFunc = function() {
      return $q.all([pollingService.methodA.query().$promise, pollingService.methodA.query().$promise)
         .then(function(result){ 
                //Setup timer again
    });
    

    【讨论】:

    • 这似乎工作得很好,但唯一的问题是结果的映射。您是否只是将结果 [id] 映射到添加承诺的次数?所以第一个将是结果 [0],第二个结果 [1] 等等。或者有什么更好的映射方式?
    • methodA 的结果将首先出现,然后是 methodB。与将promises 添加到传递给$q.all()array 的顺序相同。
    • 是的,没错。在本例中,结果以数组形式返回。
    【解决方案2】:

    使用$q.all()

    (function tick() {
        var promises = [];
        promises.push(pollingService.methodA.query().$promise);
        promises.push(pollingService.methodB.query().$promise);
        $q.all(promises).then(function(results){
            var result1 = results[0]; //Result from methodA
            var result2 = results[1]; //Result from methodB
            $timeout(tick, $scope.refreshRate);
        }
    })();
    

    【讨论】:

    • 是的,我确实考虑到了这一点。但不知道这是否是“有角度的方式”,以及它是否是一种更简单的方式而不是这样做。
    • 好吧,如果我要编写代码,我会使用promises,然后使用$q.all(promises).then(function(){ //Code });
    • 是否可以在“加载”数据时访问 promise 元素?使用我以前的方法,我可以在我的视图中访问 method1.$resolved,当调用 Promise 时,它​​会在真假之间动态变化。
    • 我猜你可以将它们分配给单独的变量:var query1 = pollingService.methodA.query()promises.push(query1.$promise)query1.$resolved; //What you want
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 2016-08-02
    相关资源
    最近更新 更多