繁体   English   中英

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

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

我对Angular JS deferred和$ q感到困惑。 我发现这个SO问题解释了$q.defer()$q之间的区别。它解释说

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

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

var deferred = $q.defer(); deferred.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');
 })

这不起作用,但是当我用$q.reject()替换deferred.reject时,promise被拒绝,控件被移动到随后的块的error函数。

任何帮助是极大的赞赏。 提前致谢。

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

你需要了解这一点

  • $q.reject()被拒绝的promise对象
  • deferred.reject() 不是一个promise,而是一个在其中一个属性中拒绝promise的延迟对象(即$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()是一个状态为“被拒绝”的promise对象。 deferred.reject() 不是一个promise,但它已将promise对象内部拒绝为deferred.$promise 用什么? 你应该使用$q.reject() ,在这种情况下使用虚拟延迟对象是多余的并且被认为是不好的做法,实际上它甚至有一个名称作为延迟反模式

确保你回复了一个承诺。

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

这与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