AngularJS在$interval上轮询$resource't自动解析$resource返回的promise
AngularJS polling a $resource on an $interval doesn't automagically resolve the promise returned from $resource
因此,重要的位:当我将控制器中的$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
。
- Angular$resource则不返回数据
- AngularJs:在内部调用$http或$resource时,让方法同步返回
- 如何使用在 AngularJS 中返回承诺的$resource测试工厂
- 从使用 $resource 的服务返回新对象
- $resource返回具有数字属性的Object
- 我无法使用angular的$resource访问asp.net mvc控制器来返回JsonResult
- 可以'我不知道ng resource为什么赢了't返回数组
- Angular JS UT:具有返回$resource方法的服务的控制器
- 返回已解析的$Resource
- AngularJS在$interval上轮询$resource't自动解析$resource返回的promise
- $resource在IE8中返回空json
- GET请求,$resource返回未定义
- 在自定义解析器中使用$resource返回值
- AngularJS 1.2.19从嵌套$resource服务返回值
- Angular $resource在api初始化后被调用,导致返回空值
- vue-resource返回一个promise对象
- 理解AngularJS $resource()返回什么(类或实例对象)
- Cordova + Angularjs -为什么从回调函数内部调用$resource(或$http)会返回404
- 如何让AngularJS使用$resource来返回multi
- 如何使此筛选器返回$http或$resource中的值