私は、$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(...)
が期待されます。foo
response.data.foo
errorCallback
言い忘れていましたが、私のサーバーは RESTful で$resource
はないため、現時点ではオプションではありません。私の URL は , のようなもの/thing/get/:id
です/thing/do-stuff/:id
。