简体   繁体   English

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

[英]AngularJS deferred.reject not working but $q.reject working

I am confused between Angular JS deferred and $q. 我对Angular JS deferred和$ q感到困惑。 I found this SO Question that explains the difference between $q.defer() and $q .It explains 我发现这个SO问题解释了$q.defer()$q之间的区别。它解释说

$q.reject is a shortcut to create a deferred and then reject it immediately $ q.reject是创建延迟的快捷方式,然后立即拒绝它

So $q.reject() must be equal to 所以$q.reject()必须等于

var deferred = $q.defer(); deferred.reject() var deferred = $q.defer(); deferred.reject() , if not please explain the actual difference between the two. var deferred = $q.defer(); deferred.reject() ,如果没有请解释两者之间的实际差异。

But in my case, $q.reject() is working, but deffered.reject() is not working. 但在我的情况下, $q.reject()正在工作,但deffered.reject()无效。 Also we need to return rejected promised like $q.reject() but not deferred.reject() . 此外,我们需要返回被拒绝的承诺,如$q.reject()但不是deferred.reject() I have seen examples where there is no return on deffered.reject() 我见过deffered.reject()没有返回的例子

This is the code 这是代码

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

This is not working, but when I replaced deferred.reject with $q.reject() , the promise has been rejected and the control is moved to the error function of the followed then block. 这不起作用,但是当我用$q.reject()替换deferred.reject时,promise被拒绝,控件被移动到随后的块的error函数。

Any help is greatly appreciated. 任何帮助是极大的赞赏。 Thanks in advance. 提前致谢。

It doesn't work when you use deferred.reject because you are not returning new rejected promise. 使用deferred.reject时它不起作用,因为您没有返回新拒绝的promise。 You can use both $q.reject() and deferred.reject() you just need to return a promise in both cases. 您可以使用$q.reject()deferred.reject() ,只需要在两种情况下都返回一个promise。

You need to to understand that 你需要了解这一点

  • $q.reject() is rejected promise object $q.reject()被拒绝的promise对象
  • deferred.reject() is not a promise, but deferred object which has rejected promise in one of its properties (namely, $promise ). deferred.reject() 不是一个promise,而是一个在其中一个属性中拒绝promise的延迟对象(即$promise )。

So you can return any object or value and it will become a new promise object and will be passed to the next then block in chain. 所以你可以返回任何对象或值,它将成为一个新的promise对象,并将被传递给下一个链中的块。 However, when you return deferred.reject() it will be passed as just some object (one more time, it is not a promise, but it has a promise inside ) and next promise will get resolved successfully of course. 但是,当您return deferred.reject()将作为只是一些传递的对象(一个更多的时间,这不是一个承诺,但它有一个承诺 )和未来的承诺将得到的当然成功地解决。

It will work properly with deferred too if you return corresponding promise: 如果您返回相应的承诺,它也将与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');
    });

And finally answer to you question: $q.reject() is a promise object with status "rejected". 最后回答你的问题: $q.reject()是一个状态为“被拒绝”的promise对象。 deferred.reject() is not a promise, but it has rejected promise object inside as deferred.$promise . deferred.reject() 不是一个promise,但它已将promise对象内部拒绝为deferred.$promise What to use? 用什么? You should use $q.reject() , using dummy deferred object is redundant in this case and considered bad practice, in fact it even has a name as deferred anti-pattern . 你应该使用$q.reject() ,在这种情况下使用虚拟延迟对象是多余的并且被认为是不好的做法,实际上它甚至有一个名称作为延迟反模式

Make sure you are returning a promise. 确保你回复了一个承诺。

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

This is working with Q ( https://github.com/kriskowal/q ) 这与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');

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM