【问题标题】:How do you access http headers when making ajax requests with Promises?使用 Promises 发出 ajax 请求时如何访问 http 标头?
【发布时间】:2015-07-23 09:14:28
【问题描述】:
我正在使用 bluebird.js 解析 jquery ajax 请求,并且访问我的请求的 http 标头非常困难。
示例代码:
Promise.resolve($.get(...)).then(function(data){
//wtb http headers
});
我正在尝试访问随我的响应返回的 http 标头。仅对 ajax 请求执行此操作很简单,我假设比我更聪明的人已经为 Promise 弄清楚了这一点。
【问题讨论】:
标签:
javascript
jquery
ajax
promise
bluebird
【解决方案1】:
解决这个问题的一种方法是保留对 jqXHR 对象的引用,以便以后访问它:
var jqXHR = $.get(...);
Promise.resolve( jqXHR ).then( function ( data ) {
var headers = jqXHR.getAllResponseHeaders();
} );
【解决方案2】:
jQuery 承诺和 bluebird 承诺(符合 Promises/A+)之间的一个区别是您的 then 函数只获取一个参数。如果您想保留 jQuery 提供给您的所有信息,您必须将其包装在一个对象中:
Promise.resolve($.get(...).then(function(data, status, xhr) {
return {
data: data,
status: status,
xhr: xhr
};
})).then(function (data) {
// data.data has the response data
// data.xhr contains the jqXHR object
});
【解决方案3】:
当通过留在 jQuery 中,jqXHR 作为形式变量可供成功和错误处理程序使用时,为什么要将 jqXHR 强制转换为其他 Promise?
$.get(...).then(function(data, testStatus, jqXHR) {
var headers = jqXHR.getAllResponseHeaders();
...
}, function(jqXHR, testStatus, errorThrown) {
var headers = jqXHR.getAllResponseHeaders();
...
});
如果出于某种原因您仍需要强制执行 jqXHR,则将整个表达式包装在 Promise.resolve(...) 中。 .then() 返回的 jQuery 承诺与 jqXHR 一样具有强制力。