我在AngularJS的自定义服务中编写了这段小代码。
为我服务:
var deferred = $q.defer(); var promise = deferred.promise; deferred.resolve('success'); deferred.reject('error'); /* Handle success and error */ promise.success = function(fn) { promise.then(function(response) { fn(response); }); return promise; }; promise.error = function(fn) { promise.then(null, function(response) { fn(response); }); return promise; };
在我的控制器中:
promiseService.myPromise() .success(function(data){ $scope.success= data; }) .error(function(data){ $scope.error = data; });
我只是处理诺言中的成功和错误($ q服务)。我在许多其他服务中都需要此代码,因此我将使用自定义直接扩展$ q服务。
因此,我希望在服务中提供以下信息:
var deferred = myPromiseService.$qCustom.defer(); var promise = deferred.promise; deferred.resolve('success'); deferred.reject('error'); return promise;
任何想法?我在Angularjs中找到了一些扩展过滤器的解释,我的问题是找到扩展$ q的所有功能并添加自定义的好方法。
我从这样的事情开始,开箱即用地处理$ q是可行的:
angular.module('myApp').service('myPromiseService', function($q){ $qCustom = $q; });
这是一个完整的解决方案,可从@jessegavin停止的地方开始。
var myApp = angular.module("myApp", []); myApp.config(function ($provide) { $provide.decorator('$q', function ($delegate) { var defer = $delegate.defer; $delegate.defer = function () { var deferred = defer(); deferred.promise.success = function (fn) { deferred.promise.then(function(response) { fn(response.data, response.status, response.headers); }); return deferred.promise; }; deferred.promise.error = function (fn) { deferred.promise.then(null, function(response) { fn(response.data, response.status, response.headers); }); return deferred.promise; }; return deferred; }; return $delegate; }); });