AngularJS - 无法获得$ q.reject和工作

问题描述:

看看我的代码示例:

我已经剥离下来到(我认为是)最基本的要素,和我设置得到一个错误deferred.reject is not a function

angular 
    .module('myApp') 
    .service('myService', MyService); 

MyService.$inject = ['$http', '$q']; 

function MyService($http, $q) { 
    var self = this; 

    self.getResult = getResult; 

    function getResult(id) { 
     var deferred = $q.defer(); 

     deferred = $http.get('my/api/method', { params: { id: id } }) 
      .then(getResultCompleted) 
      .catch(getResultFailed); 

     function getResultCompleted(response) { 
      if (response.data.ID > 0) { 
       deferred.resolve(response.data); 
      } else { 
       deferred.reject(response); 
      } 
     } 

     function getResultFailed(response) { 
      deferred.reject(response); 
     } 

     return deferred.promise; 
    } 
} 

:我知道我能得到这个由然而简单地返回$ HTTP调用的结果,为了了解这些承诺对象而言的工作,我想看看我是否能得到这工作通过宣布并返回deferred如上所示

谢谢!

+0

'$ http.get()'返回承诺,但不延迟 – Vadim

+0

@Vadim:我不明白。你可以请Elbourate? – Ricky

+0

我指的是'deferred = $ http.get()'字符串。这是不正确的,因为'$ http.get()'不会返回延迟对象,但它是承诺的。所以,你可以返回'$ http.get' – Vadim

你正在创建自定义的承诺,从你的方法还,但意味着在处理它要覆盖deferred(自定义承诺对象)与$http.get,这也返回一个具有.then & .catch方法(它没有承诺resolve & reject方法)。由于该分配,您无法访问来自deferred对象的.resolve.reject

deferred = $http.get('my/api/method', { params: { id: id } }) 

应该只有

$http.get('my/api/method', { params: { id: id } }) 
+0

谢谢@PankajParkar。这里我还有点不清楚。如果它被赋值为$ http.get的返回结果的值,那么这基本上不会意味着它的值吗? – Ricky

+0

@Ricky不..没有什么承诺的工作..承诺意味着你说,我有东西要返回&我会在一段时间后..这就是为什么你创建'var deferred = $ q.defer(); '当你收到一个响应时,你可以用数据'reject'来解析数据,使用相同的数据。如果你做'deferred = $ http.get('my/api/method',{params:{id:它将清除整个对象传统'$ http.get'承诺对象将在其中引入.. –

由于$http.get()回报承诺和成功回调支持链式API,你可以定义一个回调的内新递延对象,并从那里返回它:

angular 
    .module('myApp') 
    .service('myService', MyService); 

MyService.$inject = ['$http', '$q']; 

function MyService($http, $q) { 
    var self = this; 

    self.getResult = getResult; 

    function getResultCompleted(response) { // Tip: Define callback outside of getResult in order to avoid creating new instance of it each time getResult is called 
     var deferred = $q.defer(); 
     if (response.data.ID > 0) { 
      deferred.resolve(response.data); 
     } else { 
      deferred.reject(response); 
     } 
     return deferred.promise; 
    } 

    function getResult(id) { 
     return $http.get('my/api/method', { params: { id: id } }) 
      .then(getResultCompleted); 
    } 
} 

请注意,不再有错误回调(仅仅因为在这种情况下它是冗余的)。

如果请求失败,原始拒绝的承诺将从$http.get()将被退回,否则一个全新的成功回调承诺将用于后续.then()调用。

+0

谢谢@Vadim。 “延期”赌注在哪里申报?我在代码中看不到它(虽然也许我错过了它) – Ricky

+0

@Vadim我不明白你为什么在返回'$ http.get'时承诺使用延迟对象 –

+0

@PankajParkar一旦承诺解决了,你不能再拒绝它了。由于'$ http'原来的承诺已经解决,你需要在一定条件下拒绝它,你需要创建新的承诺,为此你需要新的延期。 – Vadim