22

この小さなコードは、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;

何か案が?私の問題は、$q のすべての機能を拡張してカスタムを追加する良い方法を見つけることです。

私はそのようなものから始めます.$qを箱から出して処理するのは仕事です:

angular.module('myApp').service('myPromiseService', function($q){

  $qCustom = $q;  

});
4

3 に答える 3

3

私見、@jessegavin の $q の装飾は完璧ではありません。success&error 関数で origin promise を返すべきではありません。コールバック ピラミッドを平坦化する機能が失われます。

また、応答データを成功とエラーの関数 $httpPromise に分割することはできません。

例えば

//can't do this..
somePromise.success(function(){
  return $http.get(...)//another primise
}).success(function(data){
  //data from $http.get..
})

これが私のバージョンです。http 応答を認識し、次の約束を返します。独自の $q を $httpPromise と同じ動作にする

$provide.decorator('$q', function($delegate) {
  function httpResponseWrapper(fn) {
    return function(res) {
      if (res.hasOwnProperty('data') && res.hasOwnProperty('status') && res.hasOwnProperty('headers') && res.hasOwnProperty('config') && res.hasOwnProperty('statusText')) {
        return fn(res.data, res.status, res.headers, res.config, res.statusText);
      } else {
        return fn(res);
      }
    };
  };
  function decorator(promise) {
    promise.success = function(fn) {
      return decorator(promise.then(httpResponseWrapper(fn)));
    };
    promise.error = function(fn) {
      return decorator(promise.then(null, httpResponseWrapper(fn)));
    };
    return promise;
  };
  var defer = $delegate.defer;
  $delegate.defer = function() {
    var deferred = defer();
    decorator(deferred.promise);
    return deferred;
  };
  return $delegate;
});
于 2014-04-23T13:32:13.650 に答える