モデルを格納するサービスを作成しましたCollector
。これは、localStorage とサーバーとのインターフェイスです。コレクターからモデルを取得する関数Collector.retrieveModel(uuid)
があり、最初に localStorage をチェックして既に存在するかどうかを確認し、そうでない場合はサーバーから要求します。
外観は次のとおりです。
var retrieveModel = function(uuid) {
var deferred = $q.defer();
var promise = deferred.promise;
if (typeof uuid === 'undefined') {
console.log("retrieveModel called without param");
deferred.resolve( collector );
}
if ( collector[uuid] = localStorage.getItem(uuid) ) {
//object was in local storage, return the data
**Problem is somewhere around here**
deferred.resolve( collector[uuid] );
} else {
//doesn't exist in collector, request it
//remoteModel is a wrapper function, which itself returns a promise, which is resolved upon a successful call using $resource
remoteModel(uuid).then(function (val) {
deferred.resolve(val);
});
}
return promise;
};
現在存在しているため、モデルが localStorage に存在しなかった (そして remoteModel が呼び出された) 場合、promise が返され、モデルがサーバーから取得されると実行されます。その後、関連する $scopes が更新されます。これは期待どおりに機能します。
ただし、モデルが localStorage に存在する場合、deferred は解決されますが、関数が promise を返す前です。したがって、解決された値が伝播されることはありません。
時期尚早に約束を果たさないように、一貫して約束を返すにはどうすればよいですか? $timeout を使用したくありません。