Angular - Pending函数,直到调用deferred.resolve

时间:2016-04-18 01:07:55

标签: angularjs service

我提供服务的时间可能超过一分钟并返回一些数据。 这里是服务代码的一部分。

    var deferred = $q.defer();
    //check data is in cache
    //if not, some process (take some time)
    deferred.resolve( data);
   });
return deferred.promise;

并尝试在连续的两个js文件中使用此服务。这是调用服务的js代码的一部分。

myService.get().then( function( data) { //works });

这就是它的工作方式。

  

加载A.js - >服务负载 - >获取数据(需要一些时间) - >保存数据   缓存 - > process A.js - > load B.js - >服务负载 - >从中获取数据   缓存 - >过程B.js

但由于A.js和B.js文件几乎同时加载,这就是目前的工作方式。

  

加载A.js - >服务负载 - >获取数据(需要一些时间) - >同时加载B.js - >服务负载 - > 获取数据(需要一段时间)重复加载数据 - > ...

如果其中一个已经使用过服务,我应该如何处理A.js或B.js服务呢?

1 个答案:

答案 0 :(得分:1)

我最近也遇到了同样的问题。以下是我为解决这个问题所做的工作。

这个想法是创建一个标志来识别http请求是否仍在进行中,并使用$ timeout重试,直到前一个请求得到解决。在重试之前,将立即返回延迟对象,但稍后会解决。

这样的事情,在您的服务中: -

var httpInProgress = false; // used to identify if a request is still in progress

//this is your service method
service.loadData = function(yourParam, defer, shouldNotReturn){
     if(!defer){
         defer = $q.defer();
     }

     if(httpInProgress){
        //if http already in progress, retry again with the same defer object.
        $timeout(function(){service.loadData(yourParam, defer, true);}, 100);
        if(!shouldNotReturn){
             //return a promise but resolve later when we actual deal with http
             return defer.promise;
        }
     }else{
       //do normal stuff if no http in progress
       service.sendActualRequest();
     }
};

service.sendActualRequest = function(yourParam, defer){
     httpInProgress = true;
     $http(request).then(function(res){
        defer.resolve(res);
     }, function(err){
        defer.reject(err);
     }).finally(function(){
         httpInProgress = false;
     });

     return defer.promise;
};