1

我编写了一个服务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。

4

1 回答 1

-1

我认为您非常接近;在移动设备上,所以我无法立即测试,但我认为如果你在 .then() 回调中解决了你的承诺,你会得到想要的结果。大意是:

deferred.promise.then(function () { 
  deferred.resolve( collector[uuid] ); 
})  

这个想法是你想等到函数返回承诺,调用 then() 来解决你的本地存储响应。

于 2013-04-04T05:06:48.557 回答