3

私のアプリケーションには、コントローラーの情報を取得するデータ サービスがあります。この情報は、ローカル ストレージ、ウィンドウ、または ajax リクエストから取得される場合があります。私が直面している問題は、$q約束の応答が応答のように見えない$httpことです。

    this.getContactDetails = function(data) {
        // The first time this method is called, we expect contact details to be preloaded on the page.
        // We want to read and return that object then remove it from the page so subsequent requests are to the server.
        if(typeof $window.preloadData.contact !== 'undefined') {
            var contactDetails = JSON.parse(JSON.stringify($window.preloadData.contact));
            delete $window.preloadData.contact;
            // Since the method call should always have the same return type, we manually create a deferred object and set the resolution using the $q service.
            var deferred = $q.defer();
            deferred.resolve(contactDetails);
            return deferred.promise;
        }
        var request = requests.contactDetails.get;
        return $http(request);
    };

サービスはここ$qでうまく機能しますが、指定されたオブジェクトとして解決されます。私はそれが応答をラップすることを本当に期待していません。私はこれを達成$httpBackend できることを知っています。

$httpBackend.whenGET(request).respond(contactDetails);

しかし、このサービスは MockE2E ライブラリで使用されており、これが意図された用途であったとは思えません。後でこれを中止する方法や、同じリクエストで2回使用した場合にどうなるかはわかりませんが、これらの質問を理解することはできます. 私のもう 1 つの懸念は、$http に渡すのと同じ構成オブジェクトを $httpBackend に渡す方法がないように見えることです。$httpBackend はメソッド、URL、本文、およびヘッダーのみを受け入れますが、$http config ではパラメーターを指定できます。

現在、私の回避策は、自分で $http のようなラッパーを作成することです。

var contactDetails = JSON.parse(JSON.stringify({
    data: $window.preloadData.contact
}));

しかし、これはあまりエレガントではありません。これを行うためのより良い/正しい方法はありますか?

4

1 に答える 1

1

ストレージ層を $cacheFactory として実装、構成段階で$httpProviderに追加できます。

ドキュメントから:

キャッシュが有効な場合、$http はサーバーからの応答を指定されたキャッシュに格納します。次に同じリクエストが行われると、サーバーにリクエストを送信せずにキャッシュからレスポンスが提供されます。

したがって、次のメソッドを使用してキャッシュの独自の実装を提供するとします。

  • {object} info() — キャッシュの ID、サイズ、およびオプションを返します。
  • {{*}}put({string} key, {*}value) — 新しいキーと値のペアをキャッシュに入れて返します。
  • {{*}}get({string} key) — キーのキャッシュされた値またはキャッシュ ミスの未定義を返します。
  • {void} remove({string} key) — キーと値のペアをキャッシュから削除します。
  • {void} removeAll() — キャッシュされたすべての値を削除します。
  • {void} destroy() — $cacheFactory からこのキャッシュへの参照を削除します。

から読み取った値、セッション Cookie などを返すことができ、それらはAJAX 要求なしでサーバーから送信localStorageされたものとして扱われます。data

于 2014-02-18T21:57:42.343 に答える