AngularJS deferred.reject无法正常工作,但$ q.reject正在工作

问题描述:

我对推迟的Angular JS和$ q之间感到困惑。我发现这个SO Question解释$q.defer()$q。它的区别解释

$ q.reject是一个快捷方式创建一个延迟,然后拒绝立即

所以$q.reject()必须等于

var deferred = $q.defer(); deferred.reject(),如果不是请说明两者的实际区别。

但在我的情况下,$q.reject()正在工作,但deffered.reject()不起作用。此外,我们需要返回拒绝承诺,如$q.reject()但不是deferred.reject()。我所看到的例子那里是deffered.reject()

这不归是,这是不工作的代码

var deferred = $q.defer(); 
myService.getData() 
.then(function(response){ 
    deferred.notify('Just a notification'); 
    deferred.reject('rejected'); 
}) 
.then(function(response) { 
    console.log('done');  
}, function(response) { 
    console.log('rejected'); 
}) 

,但是当我更换deferred.reject$q.reject(),承诺已被拒绝,并且控制移到随后的错误功能块。

任何帮助,非常感谢。提前致谢。

+0

它不会在您的情况在所有的工作,你链式'。然后(功能(响应...'到诺言'.getData( )'已经返回了,而不是延迟'已经返回的承诺,为什么这个工作没有意义? –

当您使用deferred.reject时不起作用,因为您没有返回新的被拒绝承诺。在这两种情况下,您只需使用$q.reject()deferred.reject()即可退货。

你需要明白,

  • $q.reject()被拒绝承诺对象
  • deferred.reject()承诺,但推迟其在它的一个属性已经拒绝承诺对象(即$promise)。

因此,您可以返回任何对象或值,它将成为一个新的承诺对象,并将传递给链中的下一个块。然而,当你return deferred.reject()它将被作为一个对象传递(再一次,这不是承诺,但它有承诺内),当然下一个承诺将得到成功解决。

它将与deferred正常工作太多,如果你返回相应的承诺:

var deferred = $q.defer(); 
myService.getData() 
    .then(function(response) { 
     deferred.notify('Just a notification'); 
     deferred.reject('rejected'); 
     return deferred.promise; 
     //return $q.reject(); 
    }) 
    .then(function(response) { 
     console.log('done'); 
    }, function(response) { 
     console.log('rejected'); 
    }); 

最后回答你的问题:$q.reject()与地位的承诺对象“拒绝”。 deferred.reject()不是一个承诺,但它拒绝承诺对象里面为deferred.$promise。要使用什么?你应该使用$q.reject(),在这种情况下使用虚拟延迟对象是多余的,并被认为是不好的做法,事实上它甚至有一个名称为deferred anti-pattern

+0

好的答案!非常感谢。还有一个问题。什么是实际承诺对象和差异对象。 – Wishnu

+0

promise对象在deferred.promise中可用。当我登录对象时得到它。 – Wishnu

+0

我的疑问是我们返回的diferred.promise与我们在错误块中获取的响应对象不同。幕后发生了什么? – Wishnu

确保你已经回复了承诺。

function getData() { 
    var deferred = $q.defer(); 
    myService.getData() 
     .then(function (response) { 
      deferred.resolve('Just received a notification'); 
     }).catch(function (err) { 
      deferred.reject(err); 
     }; 

    return deferred.promise; 
} 

getData().then(function (response) { 
    console.log('done'); 
}, function (response) { 
    console.log('rejected'); 
}); 
+0

我实际上有这个代码片段在我的控制器里面,请你解释一下为什么我应该返回一个承诺 – Wishnu

+0

当然,承诺是'.then','.catch','.finally'的属性,所以你必须返回承诺,以便它可以实现。当你做'$ q.reject'时,你返回一个履行了诺言,尽管被拒绝了。 –

这正与Q(https://github.com/kriskowal/q

var def = Q.defer(); 
def.promise 
.then(
    function(ok){ 
     return ok; 
    }, 
    function(err){ 
     var d = Q.defer(); 
     d.reject(err); 
     return d.promise; 
    } 
) 
.then(
    function(ok){ 
     console.log('ok',ok); 
    }, 
    function(err){ 
     console.log('err',err); 
    } 
); 
def.reject('error');