1

私は、$q 構文をあまり繰り返さずに AngularJS サービスを作成するエレガントな方法を見つけようとしています。

現在、次のようなサービスを書いています。

(function() {

    function ServiceFactory($q, $timeout, $http) {
        return {
            getFoo: function() {
                var deferred = $q.defer();

                $timeout(function() {
                    $http.get('/the/foo/thing').then(function(response) {
                        if (response.isError) {
                            deferred.reject();
                        } else {
                            deferred.resolve(response.data.foo);
                        }
                    }, function() {
                        deferred.reject();
                    });
                });

                return deferred.promise;
            }
        };
    }

    angular.module('myapp').service('MyService', ['$q', '$timeout', '$http', ServiceFactory]);

}.call(this));

$http.get を遅らせて Promise を公開するためだけに、私はいつもたくさんのコードを書き留めています。場合によっては、データの処理、別の応答オブジェクトの作成など、成功のコールバックに追加のものを追加することもあります...しかし、ほとんどの場合、上記のコードと同じです:call $q.defer + $http.get().then... + return promise

そのため、私がやっていることの明確さに影響を与えずにコードをクリーンアップ/削減する方法を考えています。たとえば、別の開発者がファイルを開いた場合、それは謎ではありません。

補足として、ここの $http サービスは実際にはデコレーターであり、サーバーの応答を処理して、 や などのより構造化されたオブジェクトを提供しresponse.isErrorますresponse.data

また、別の質問 {1} で同様の解決策を見たことがありますが、これは同じではありません。の応答を返すだけでは、応答時に応答$http.get().then()全体がコントローラーに公開されますが、これは望ましい効果ではありません。代わりに、 を呼び出すと、 を介してサーバーから供給されるサービスからの応答として、または への呼び出しとしてオブジェクトMyService.getFoo().then(...)が期待されます。fooresponse.data.fooerrorCallback

言い忘れていましたが、私のサーバーは RESTful で$resourceはないため、現時点ではオプションではありません。私の URL は , のようなもの/thing/get/:idです/thing/do-stuff/:id

{1} 類似の質問

4

1 に答える 1