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



所以$q.reject()必须等于
var deferred = $q.defer(); deferred.reject(),如果不是,请说明两者之间的实际区别。

但就我而言,$q.reject()有效,但是deffered.reject()不起作用。另外,我们需要返回被拒绝的 promise ,例如$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块的错误函数中。

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

最佳答案

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

您需要了解

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

  • 因此,您可以返回任何对象或值,它将成为一个新的Promise对象,并将被传递给下一个然后是链中的块。但是,当您使用return 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()是状态为“已拒绝”的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/

    10-12 06:56