2016-11-09 77 views
1

我的應用出現問題。我有一家工廠,調用prepareStorage將我的restApi中的所有靜態變量保存到瀏覽器存儲(使用ngStorage)。這似乎是這樣的:AngularJS解決所有路由的一些工廠承諾

angular.module('panelApp') 
     .factory('prepareStorage', ['$localStorage', '$sessionStorage', 'apiService', 

    function($localStorage, $sessionStorage, apiService) { 
    var promise = {}; 
    var load = function() { 
    apiService.call('head', 'staticTypes.json', [], function(response, status, head) { 

    if(angular.isUndefined($localStorage.staticTypes) || $localStorage.staticTypes.updatedAt < new Date(head()['last-modified'])){ 
     delete $localStorage.staticTypes; 
     promise = apiService.call('get', 'statictypes.json', [], function (response) { 
      $localStorage.staticTypes = response; 
     }, function (errorObj) { 
      console.log(errorObj.error.message); 
     }); 
    } 
    }); 


    return promise; 

    return { 
      load: load() 
     }; 
}]); 

然後我宣佈第二工廠constantsService,這給了我存儲瓦爾:

angular.module('panelApp') 
    .factory('constantsService', ['$localStorage', '$q', 'prepareStorage', '$timeout', 

    function($localStorage, $q, prepareStorage, $timeout) { 
    var output = {}; 
    var deferred = $q.defer(); 

    $timeout(function() { 
     deferred.resolve(prepareStorage.load, function() { 
      output = { 
       status: $localStorage.staticTypes.status 
      }; 
     }); 
    }, 1000); 

    return output; 

}]); 

現在來我的麻煩在這種情況下。

我不能在我的控制器內沒有 重新刷新這個存儲變量。這意味着,在第一次刷新站點後, 控制器不會找到$localStorage.staticTypes.status對象,只有當我再次刷新時纔會執行此操作。

我正在尋找一個乾淨的解決方案,避免$timeout服務使用情況。

在此先感謝。

回答

0

您是否嘗試過使用這種不同的圖案?

prepareStorage

angular.module('panelApp') 
     .factory('prepareStorage', prepareStorage); 

prepareStorage.$inject = [ '$localStorage', '$sessionStorage', 'apiService' ]; 

    function prepareStorage ($localStorage, $sessionStorage, apiService) { 

    var vm = this; 

    vm.load = function() { 
     return new Promise(function(resolve, reject){ 
      apiService.call('head', 'staticTypes.json', [], function(response, status, head) { 
      if(angular.isUndefined($localStorage.staticTypes) || $localStorage.staticTypes.updatedAt < new Date(head()['last-modified'])){ 
      delete $localStorage.staticTypes; 
      apiService.call('get', 'statictypes.json').then(function (response, error) { 
       if(response){ 
       $localStorage.staticTypes = response; 
       return resolve(response); 
       } 
       return reject(error); 
      }); 
      } 
      }); 
     }); 
    } 

    return { 
      load: load 
     }; 
}); 

而且constantsService

angular.module('panelApp') 
    .factory('constantsService', constantsService); 

    constantsService.$inject = [ '$localStorage', '$q', 'prepareStorage', '$timeout' ]; 

    function constantsService($localStorage, $q, prepareStorage, $timeout) { 

    var vm = this; 

    vm.getStorage = function(){ 
    prepareStorage.load().then(function(response){ 
     return response; 
    }); 
    } 


    return : { 
       getStorage : getStorage 
    } 

}]); 

而且我會重構apiService是一個Promise本身就像

. . . 

//E.g. Method = get, document = statictypes.json 
vm.call = function(method, document){ 
    return new Promise(function (resolve, reject){ 
     ... do something 
     if(everyThingIsOk){ 
     return resolve(response); 
     } 

     return reject(error); 
    }); 
} 

我不能保證這是正確的100%,但它應該工作,如果你知道如何使用它。你只是在做一些事情之前等待承諾回來。我認爲你應該象我一樣構建你的apiService,所以你也可以使用.then()

希望它有幫助。

+0

嗨,謝謝你的幫助。我試了一下 - 首先解決FEX錯誤 - 終於返回的對象getStorage是內部控制的呼叫後未定義(如getStorage> vm.getStorage): constantsService.getStorage() 但響應也是正確的 – Joeker

+0

嗨,你能解釋一下更好?我不明白你的意思*首先解決fex錯誤(例如,getStorage - > vm.getStorage),最後在控制器內部調用後返回的對象getStorage未定義:constantsService.getStorage(),但響應也是正確的* – AndreaM16

+0

PS:在apiService法「稱之爲」具有以下初始化: 'code'call:函數(方法,終端,有效載荷,成功,錯誤,URL){} – Joeker