我在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.headers);
- });
- return deferred.promise;
- };
- return deferred;
- };
- return $delegate;
- });
- });