Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在承诺解析时手动将承诺的结果放入范围变量中?_Javascript_Angularjs_Promise_Angular Resource - Fatal编程技术网

Javascript 如何在承诺解析时手动将承诺的结果放入范围变量中?

Javascript 如何在承诺解析时手动将承诺的结果放入范围变量中?,javascript,angularjs,promise,angular-resource,Javascript,Angularjs,Promise,Angular Resource,假设在讨论中,我正在构建一个股票行情应用程序,需要每2秒更新一次价格,我有一个$resource包装在对WebApi的调用中,我的控制器上有$scoped变量,用于维护这些$resource调用的结果 我正在修改Angular文档中$interval的示例。主要区别在于,在我的时间间隔内,我正在将$scoped变量更新为$resource的结果 我一直在使用Angular的自动promise resolution来绑定变量,但现在我已经在一个间隔上更新了符号,每次触发间隔时,数据都会擦除,直到p

假设在讨论中,我正在构建一个股票行情应用程序,需要每2秒更新一次价格,我有一个$resource包装在对WebApi的调用中,我的控制器上有$scoped变量,用于维护这些$resource调用的结果

我正在修改Angular文档中$interval的示例。主要区别在于,在我的时间间隔内,我正在将$scoped变量更新为$resource的结果

我一直在使用Angular的自动promise resolution来绑定变量,但现在我已经在一个间隔上更新了符号,每次触发间隔时,数据都会擦除,直到promise解析后才会显示,所以我的视图中出现了“挡风玻璃雨刮器效果”。我真正想要的是显示“旧数据”,直到承诺返回,此时,结果将填充到我的作用域变量和视图中

使用以下代码最简单的方法是什么

我尝试引入一个中间变量,将它分配给$resource.bar()中的promise,并在间隔内注册一个成功回调,但成功回调从未触发

'use strict';
var ctrls = angular.module('MyModule',[]);
ctrls.controller('FooCtrl', ['$scope', '$location','$interval','$document','service',
  function( $scope,$location,$interval,$document,service)
  {
     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(); 
    });
  }


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;
}]);
编辑 在我发布问题后不久,一位同事就能够帮助我。我试图通过承诺中的.then()注册成功回调,这显然是错误的。成功回调可以直接放在
service.bar()调用中作为第一个参数。所以,在这种情况下,我的代码变成了

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

我建议更换:

$scope.Bars = service.Bars;
比如:

service.Bars.get().$promise.then( 
    function (data) {
        $scope.Bars = data;
    }
);
仅在资源中有数据时设置范围变量

service.Bars(function(data){
   if(data)$scope.Bars = data;
});

是我要找的机器人吗

为什么不也定义一个错误回调,看看它是否被调用?我在发布问题后很快就找到了答案。我试图在promise上注册一个.then()方法,但从一位同事那里发现.then是隐含的。你只需将成功和失败的回调放在promise的paren中,我尝试了这种语法,但它不起作用。适用于我的语法是
service.bar(函数(数据){if(数据)$scope.bar=data;})