データをlocalStorageにキャッシュするサービスをAngularで作成しようとしていますが、あまり成功していません! あなたの助けが必要です。ブローカー コードや航空会社コードなど、あまり頻繁に変更されない「ルックアップ」データ型がいくつかあります。
私は自分の (多くの!) 技術書の 1 つで、あらゆるデータ型をプロミスでラップすることが可能であると読んだことを覚えており、サービスを作成する際にこのアプローチを採用しています。基本的に、存在する場合は localStorage から値を返し、解決された約束ですぐに返したいと考えています。または、存在しない場合は、 $http.get() して、この呼び出しから返された promise を返します。
私の疑似コードは次のようになります。
angular.module('myApp')
.service("lookupDataService", function() {
this.brokers = function() {
var cachedBrokers = localStorage.getItem("brokers");
if (!cachedBrokers) {
$http.get('/api/brokers')
.success(function(data) {
localStorage.setItem("brokers", data);
// return promise
});
} else {
var deferred = $q.defer();
deferred.resolve();
// shoehorn the data from localStorage
return deferred;
}
}
})
このアプローチは健全ですか?プロミスとデータを呼び出し動作に返すにはどうすればよいですか?
編集
依存性注入を正しく行っていないことに気付きました。疑似コードを次のように変更しました。
angular.module('myApp')
.service("lookupDataService", ['$q','$http', function($q, $http) {
this.brokers = function() {
var cachedBrokers = localStorage.getItem("brokers");
if (!cachedBrokers) {
return $http.get('/api/brokers')
.success(function(data) {
localStorage.setItem("brokers", data);
}
);
} else {
return $q.when(cachedBrokers);
}
}}]
)
内部の約束が解決されるまで、私のメソッドは約束を返さないことに気づきました。おもう。頭を悩ませる瞬間。
M