AngularJS deferred.reject不起作用,但$ q.reject工作

时间:2015-07-11 17:39:53

标签: javascript angularjs angular-promise

我对Angular JS deferred和$ 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()时,承诺被拒绝,控件被移动到随后阻塞的错误函数。

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

3 个答案:

答案 0 :(得分:5)

当您使用deferred.reject时,它不起作用,因为您没有返回新拒绝的承诺。您可以同时使用$q.reject()deferred.reject()两种情况下都需要返回承诺。

您需要了解

  • $q.reject()被拒绝承诺对象
  • deferred.reject() 是一个承诺,但延迟对象在其某个属性中拒绝了承诺(即$promise)。

因此,您可以返回任何对象或值,它将成为新的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的名称。

答案 1 :(得分:2)

确保您要回复承诺。

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');
});

答案 2 :(得分:0)

这适用于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');