gpt4 book ai didi

javascript - AngularJS deferred.reject 不工作但 $q.reject 工作

转载 作者:数据小太阳 更新时间:2023-10-29 06:06:03 25 4
gpt4 key购买 nike

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

$q.reject is a shortcut to create a deferred and then reject it immediately

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

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

但在我的例子中,$q.reject() 正在工作,但是 deffered.reject() 没有工作。我们还需要像 $q.reject() 但不是 deferred.reject() 那样返回被拒绝的 promise 。我见过 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 block 的功能。

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

最佳答案

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

你需要明白这一点

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

所以你可以返回任何对象或值,它将成为一个新的 promise 对象,并将传递给链中的下一个 then block 。但是,当您返回 deferred.reject() 时,它将作为某个对象传递(再一次,它不是一个 promise,但它内部有一个 promise)下一个 promise 当然会成功解决。

如果您返回相应的 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”的 promise 对象。 deferred.reject() 不是一个 promise ,但它在内部拒绝了 promise 对象作为deferred.$promise。用什么?您应该使用 $q.reject(),在这种情况下使用虚拟延迟对象是多余的并且被认为是不好的做法,事实上它甚至有一个名称 deferred anti-pattern .

关于javascript - AngularJS deferred.reject 不工作但 $q.reject 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31359974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com