如何在promise解析时手动将promise的结果获取到作用域变量中

How do I get the results of a promise into a scoped variable manually upon promise resolution?

本文关键字:promise 获取 结果 作用域 变量      更新时间:2023-09-26

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

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

我一直在使用Angular的自动promise解析来绑定我的变量,但现在我已经在间隔上更新了我的符号,每次间隔启动时数据都会擦除,直到promise解析后才会显示,所以我在View上得到了"挡风玻璃雨刷效果"。我真正想要的是显示"旧数据",直到promise返回,此时,结果将被填充到我的作用域变量和视图反弹中。

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

我尝试引入一个中间变量,将其分配给$resource.Bars()中的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()在promise上注册一个成功回调,但这显然是不正确的。成功回调可以直接放在service.Bars()调用中作为第一个参数。所以,在这种情况下,我的代码变成了

$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;
});

是我要找的机器人