当函数请求时,在拦截HTTP请求和响应时调用requestError,response,responseError?

时间:2014-05-28 16:21:42

标签: javascript angularjs

documentation提到你可以为拦截器定义4个函数,它说:

  

有两种拦截器(以及两种拒绝拦截器):

     

请求:使用http配置对象调用拦截器。该函数可以自由修改配置对象或创建新对象。该   函数需要直接返回配置对象,或者承诺   包含配置或新的配置对象。

     

requestError:当前一个拦截器抛出错误或通过拒绝解决时,会调用拦截器。

     使用http响应对象调用

响应:拦截器。该函数可以自由修改响应对象或创建新对象。   该函数需要直接返回响应对象,或者作为a   包含响应或新响应对象的promise。

     

responseError:当前一个拦截器抛出错误或通过拒绝解决时,会调用拦截器。

我只定义了一个拦截器。我注意到如果响应HTTP代码是403,则调用responseError函数。我不确定还有什么可能触发它。 文档中的位置是否说明了何时调用这4个函数?请引用任何有信誉的消息来源。

它说:

  

“...当前一个拦截器抛出错误或用a解决时   拒绝“

什么时候抛出错误或者如何通过拒绝解决?我需要对这一部分进行更详细的阐述。

1 个答案:

答案 0 :(得分:3)

好吧,正如你所料......

在将请求发送到服务器之前触发

请求拦截器(当然在使用transformRequest函数转换数据之前)。

发生请求错误时会触发

requestError 拦截器,即如果以前的任何请求拦截器发出错误或返回了被拒绝的承诺。

一旦响应从服务器到达,就会触发

响应拦截器。请注意,响应拦截器以反向注册顺序触发。

当HTTP状态代码指示错误(即它不是重定向且超出[200-299]范围)或任何先前的响应拦截器抛出时,会触发

responseError 拦截器错误或返回了被拒绝的承诺。


关键点在于,上述任何方法都可以返回“普通”对象/原语或将使用适当值解析的promise。在后一种情况下,队列中的下一个拦截器将一直等到返回的promise被解析或拒绝。

在此上下文中,抛出错误是指普通的旧JavaScript错误。例如。尝试访问不存在的方法(myObj.methodThatDoesNotExit())或明确提出异常(throw Error())。

可以通过返回$q.reject(someObj)或在返回承诺的延迟对象上调用.reject(reason)来创建被拒绝的承诺。


正如文档所述,在开始创建拦截器之前,“非常重要,请务必理解 $q and deferred/promise APIs


处理拦截器的源代码(v1.2分支 - 当前版本1.2.16)的相关部分位于ng/http.js

line 127 - line 155
line 685 - line 724