2016-04-18 20 views
0

我提出的服務可能需要一分多鐘並返回一些數據。 這裏有一部分服務代碼。Angular - 直到調用depending.resolve的掛起函數

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 - >服務負載 - >獲取數據(需要一些時間) - >保存數據 緩存 - >進程A.js - >負載B.js - >服務負載 - >獲取數據從 緩存 - >進程B.js

但由於A.js和B.js文件加載在幾乎同一時間,這是多麼目前的工作。

負荷A.js - >服務負載 - >獲取數據(需要一些時間) - >同時加載B.js - >服務負載 - >獲取數據(需要一些時間)重複加載數據 - > ...

我應該如何處理A.js或B.js服務,如果其中一個服務已經在使用?

回答

1

我最近遇到了同樣的問題。這是我做的解決它。

這個想法是創建一個標誌,以確定一個http請求是否仍在進行中,並使用$超時重試,直到前一個請求已解決。在重試之前,一個延遲對象將立即返回,但稍後解決。

這樣的事情,在您的服務: -

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; 
}; 
+0

很難直接在我的服務使用,但你給了我一個新的景象。謝謝 :) –

相關問題