documentation提到你可以为拦截器定义4个函数,它说:
有两种拦截器(以及两种拒绝拦截器):
请求:使用http配置对象调用拦截器。该函数可以自由修改配置对象或创建新对象。该 函数需要直接返回配置对象,或者承诺 包含配置或新的配置对象。
requestError:当前一个拦截器抛出错误或通过拒绝解决时,会调用拦截器。
使用http响应对象调用响应:拦截器。该函数可以自由修改响应对象或创建新对象。 该函数需要直接返回响应对象,或者作为a 包含响应或新响应对象的promise。
responseError:当前一个拦截器抛出错误或通过拒绝解决时,会调用拦截器。
我只定义了一个拦截器。我注意到如果响应HTTP代码是403,则调用responseError
函数。我不确定还有什么可能触发它。 文档中的位置是否说明了何时调用这4个函数?请引用任何有信誉的消息来源。
它说:
“...当前一个拦截器抛出错误或用a解决时 拒绝“
什么时候抛出错误或者如何通过拒绝解决?我需要对这一部分进行更详细的阐述。
答案 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
: