我编写了一个服务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),则返回承诺,并在从服务器检索模型后履行。随后,相关的 $scopes 被更新。这按预期工作。
但是,当模型存在于 localStorage 中时,deferred 被解析,但在函数返回 promise 之前。因此,解析的值永远不会传播。
我该怎么做才能始终如一地回报承诺,但又不会过早兑现?我不想使用 $timeout。