javascript - "return $q.reject(response)"是做什么的?

标签 javascript angularjs angular-http-interceptors

我对声明的内容有点困惑

return $q.reject(response);

responseError 拦截器中执行。

我已经经历了this article on webdeveasyone on angular docs但他们没有帮助。

这是我的代码(供引用):

(function () {
    "use strict";
    angular.module('xyz').factory('errorResponseInterceptor', ['$q', 'toaster', function ($q, toaster) {
        return {
            ...
            ...
            ...
            responseError: function (response) {
                ...
                ...
                //some logic here
                ...
                ...
                if (response.status == 500) {
                        toaster.error({ title: "", body: response.statusText });
                    return $q.reject(response);//what does this statement does and why do we need to put it here?
                }
                return response;
            }
        };
    }]);
}());

我的问题是:

  1. 为什么我们需要写return $q.reject(response)
  2. 这条线如何影响 Angular 应用程序(它做了什么)?

最佳答案

Angular 中的 $q 对象允许我们定义 promise 并处理与 promise 相关的行为。我们如何做到这一点的一个例子是:

var q = $q.defer()

//do something
if(success){
  q.resolve()
} else {
  q.reject()
}

return q

我们在这里所做的是定义一个 promise 对象并将其分配给变量 q。然后我们执行一些操作并使用该操作的结果来确定 promise 是否成功返回。在 promise 对象上调用 .resolve() 表示 promise 已正确返回。出于同样的原因,对 promise 调用 .reject() 表示失败的事实。

如果我们考虑我们实际使用 promise 的方式:

SomeFactory.getSomething().then(function(data){
  //gets called if promise resolves
}, function(error){
  //gets called if promise rejected
}

所以在您提供的示例中,我们正在检查响应是否有 500 错误代码,如果有,我们将拒绝 promise ,从而允许我们处理错误。

responseError 拦截器中,关于返回的内容,您有两种选择。如果您返回 $q.reject(response),您将继续错误处理事件链。如果您返回任何其他内容(通常是新的 promise 或响应),则表示错误已从中恢复并且应被视为成功。

关于你的两点:

1- 您需要编写该行以指示响应仍应被视为错误。

2- 对 Angular 应用程序的影响是将调用错误回调而不是成功回调。

关于javascript - "return $q.reject(response)"是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35474408/

相关文章:

angular - Angular 2中的错误处理程序和拦截器有什么区别?

angular - 如何在调用我的 api 之前减慢/​​等待?

javascript - 如何在 html 中调用 rootscope 函数 - Angularjs

javascript - 当 AngularJS 中没有提供嵌入槽时,如何不渲染它?

Angular 5 Interceptor 不会拦截来自库的请求

javascript - jQuery .not() 函数不起作用

javascript - 有效的正则表达式特定名称模式

javascript - 本地网络上的其他人如何在我的机器上运行时访问我的 NodeJS 应用程序?

javascript - 从 JS 到 iphone 开发 - 最好从什么语言开始?

angularjs - AngularJS,ng-class和带 Angular 表达的类之间的区别?