2017-09-19 10 views
0

連鎖約束で失われた余分な「成功」の方法で、私はこのように、それにいくつかの余分なメソッドを追加私のangularJSで「$のQ」のためのデコレータ持っている:

angular 
    .module('myApi', []) 
    .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; 
     }; 
     return deferred; 
     }; 
     return $delegate; 
    }); 
    }); 

をしかし、私は、APIでこれを行うときにメソッドが消える:

var DataFactoryBase = { 

    get: function (url, headers) { 
    var dfr = $q.defer(); 
    dfr.resolve(api_bridge ({ 
     execute: function() { 
     return $q.resolve($http.get(url, {headers: headers})); 
     } 
    })); 
    //this line still holds the decorator method 
    var withSuccessMethod = dfr.promise; 
    //this line returns a promise without the decorator methods 
    var lostSuccessMethod = dfr.promise.then(handlerSuccessResponse, handlerErrorResponse); 
    return lostSuccessMethod; 
    } 

} 

function handlerSuccessResponse(response) { 
    //do stuff 
    return $q.resolve(response); 
}  


function handlerErrorResponse(response) { 
    //do stuff 
    return $q.reject(response.data); 
} 

にはどうすれば.thenも成功メソッドで約束を返すことができますか?

答えて

0

公約と延期は、2つの異なるものです(後者は前者を使用します)。 .thenを呼び出すときに返された約束を変更することは、延期の基礎となる約束を得ることを要求する。できますObject.getPrototypeOf()

angular 
    .module('myApi', []).config(function ($provide) { 
    $provide.decorator('$q', function ($delegate) { 
     var defer = $delegate.defer; 
     $delegate.defer = function() { 
     var deferred = defer(); 
     Object.getPrototypeOf(deferred.promise).success = function(callback) { 
      /* code */ 
     } 
     return deferred; 
     }; 
     return $delegate; 
    }); 
    });