AngularJS在$interval上轮询$resource't自动解析$resource返回的promise

AngularJS polling a $resource on an $interval doesn't automagically resolve the promise returned from $resource

本文关键字:resource 返回 promise interval AngularJS      更新时间:2023-09-26

因此,重要的位:当我将控制器中的$scope变量直接绑定到$resource时,angular的自动承诺解析将接管,并且一旦数据从服务返回,我的视图就会立即更新。但是,我需要每隔一段时间轮询服务器以获取更新。尝试绑定到$interval调用返回的promise并不会触发angular的自动promise解析,我不知道是否有什么方法可以让这个$interval对$resource起作用。

Angular客户端,服务JSON的ASP.NET WebApi,位于WebApi之上的Angular$资源。在我的angular控制器中,如果我将$scoped变量直接绑定到$resource promise,我会得到结果;但是,我需要$resources来更新$interval,并且在引入该interval时遇到问题。

正在工作,"需要手动刷新"代码(至少相关部分)

'use strict';
var ctrls = angular.module('MyModule',[]);
ctrls.controller('FooCtrl', ['$scope', '$location','service',
  function( $scope,$location,service)
  {
     $scope.Bars = service.Bars;
     $scope.Baz = service.Baz;
  }
var app = angular.module('MyModule.Services',['ngResource']);
app.service('service', ['$resource', function($resource)
{
  var proxy = $resource(
       'http://server/subsystem/api/Foo/:component',
        {},
        {
           Bars: {method:'GET',isArray:false,url: 'http://server/subsystem/api/Foo/Bars'
          ,Baz: {method:'GET',isArray:false,rul: 'http://server/subsystem/api/Foo/Baz'
        }
  return proxy;
}]);

废话废话,在我的视图中重复绑定到"条中条"=数据到屏幕。

所以现在,我进入我的控制器来实现我的间隔,我可以让间隔工作,但承诺没有解决。

控制器内部的更改(注意,我在依赖列表中添加了$interval和$document:

var stop;
$scope.Bars = {};
$scope.Baz = service.Baz; //Note that angular resolves this promise automatically.
$scope.pollService = function(){
   if(angular.isDefined(stop))return;
   stop = $interval(function(){
     if(service){
        $scope.Bars = service.Bars;
     }
   },1000);
};
$scope.stopPolling = function(){
   if(angular.isDefined(stop)){
     $interval.cancel(stop);
     stop = undefined;
   }
};
$scope.$on('$destroy',function(){
   $scope.stopPolling();
});
$document.ready(function(){
   $scope.pollService(); //when I attempt to execute my .then() on pollService(), I get "cannot 
                         //call then on undefined"
});

编辑

请注意,我遇到的问题是将$scope.Bars直接绑定到服务。Bars触发angular的自动promise解析,但引入$interval调用似乎不是。在Chrome开发工具中检查$scope.Bars表明这是一个未解析的promise。

我更新了示例代码以匹配调试器中当前的代码。我在我的资源上定义了几个属性,其中包括一个我命名为"Baz"的属性。如果我分配$scope.Baz=服务。Baz直接在我的控制器中,当angular解析承诺时,视图与它绑定,但间隔上的视图从未解析。

您不会从$scope.pollService返回promise。只需在函数末尾添加return stop;即可。还要注意,按照API的编写方式,如果定义了stop,则函数仍将返回undefined

因此,它可能看起来像:

$scope.pollService = function(){
   if(!angular.isDefined(stop)) {
       stop = $interval(function() {
         if(service){
            $scope.Bars = service.Bars;
         }
       }, 1000);
  }
  return stop;
};

stop也不是一个很好的描述性名称。。。

编辑:

根据我在阅读文档后的理解,您应该调用像$scope.Bars = service.Bars();这样的服务上的操作方法。这将返回一个对象,一旦承诺得到解决,该对象最终将填充数据。然而,我认为您在这里也需要小心,因为如果间隔的启动速度快于承诺的解决速度,您可能会遇到问题。我认为你最好使用$timeout