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 が呼び出された) 場合、promise が返され、モデルがサーバーから取得されると実行されます。その後、関連する $scopes が更新されます。これは期待どおりに機能します。

ただし、モデルが localStorage に存在する場合、deferred は解決されますが、関数が promise を返す前です。したがって、解決された値が伝播されることはありません。

時期尚早に約束を果たさないように、一貫して約束を返すにはどうすればよいですか? $timeout を使用したくありません。

4

1 に答える 1

-1

あなたはとても親しいと思います。モバイルではすぐにテストすることはできませんが、.then() コールバック内で約束を解決すれば、望ましい結果が得られると思います。効果のあるもの:

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

関数が promise を返すまで待ち​​たいという考えは、ローカル ストレージの応答を解決する then() を呼び出します。

于 2013-04-04T05:06:48.557 に答える