簡體   English   中英

如何根據承諾解析將承諾的結果手動輸入到范圍變量中?

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

進行討論,假設我正在構建一個股票行情收錄器應用程序,並且需要每2秒更新一次價格,在對WebApi的調用中包裝了$ resource,並且在控制器上保留了$ scoped變量來維護這些$ resource調用的結果。

我正在對Angular文檔中的示例進行修改,以實現$ interval。 主要區別在於,在我的時間間隔內,我將$ scoped變量更新為$ resource的結果。

我一直在使用Angular的自動諾言解析來綁定變量,但是現在我已經在一個時間間隔上更新了我的符號,每次觸發該間隔時數據都會擦除,並且直到諾言得到解決才顯示數據,所以我在我的視圖上獲得“擋風玻璃刮水器效果”。 我真正想要的是在“諾言”返回之前顯示“舊數據”,這時,結果將填充到我的范圍變量中,並且視圖反彈。

用下面的代碼最簡單的方法是什么?

我嘗試引入一個中間變量,將其分配給$ 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;
}]);

編輯

我發布問題后不久,一位同事就能夠為我提供幫助。 我試圖在promise上通過.then()注冊一個成功回調,這顯然是不正確的。 成功回調可以直接放在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;
});

是我要尋找的機器人

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM