【问题标题】:AngularJS deferred.reject not working but $q.reject workingAngularJS deferred.reject 不工作但 $q.reject 工作
【发布时间】:2015-09-30 08:04:35
【问题描述】:

我对 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() 时,promise 已被拒绝,并且控件被移动到后续 then 块的错误函数。

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

【问题讨论】:

  • 它在您的场景中根本不起作用,您将.then(function (response... 链接到.getData() 已返回的承诺,而不是deferred 已返回的承诺。为什么要这样做?这没有意义。

标签: javascript angularjs angular-promise


【解决方案1】:

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

你需要明白这一点

  • $q.reject() 被拒绝的承诺对象
  • deferred.reject() 不是承诺,而是延迟对象,它在其属性之一(即$promise)中拒绝了承诺。

所以你可以返回任何对象或值,它将成为一个新的 Promise 对象,并将传递给链中的下一个 then 块。但是,当您 return deferred.reject() 时,它会作为某个对象传递(再一次,它不是一个 Promise,但它有一个 Promise inside),当然下一个 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');
    });

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

【讨论】:

  • 很好的答案!非常感谢。只是另一个问题。什么是promise对象和diferred对象。
  • promise 对象在 deferred.promise 中可用。当我记录对象时得到它。
  • 我怀疑我们返回的 diferred.promise 与我们在错误块中得到的响应对象不同。幕后发生了什么?
  • deferred.$promise 不是一件事
【解决方案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');
});

【讨论】:

  • 我的控制器中实际上有这个代码 sn-p。你能解释一下为什么我应该返回一个承诺。
  • 当然,promise 具有.then.catch.finally 的属性,因此您必须返回 promise 才能实现它。当您执行 $q.reject 时,您将返回一个已履行的承诺,尽管它被拒绝了。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-02
    • 2014-08-18
    • 2017-05-10
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多