使用 Promises 发出 ajax 请求时如何访问 http headers?
How do you access http headers when making ajax requests with Promises?
我正在使用 bluebird.js 解析 jquery ajax 请求,但访问我请求的 http headers 出奇地困难。
示例代码:
Promise.resolve($.get(...)).then(function(data){
//wtb http headers
});
我正在尝试访问随我的响应返回的 http headers。仅根据 ajax 请求执行此操作很简单,我想比我聪明的人已经想出了这个承诺。
jQuery promises 和 bluebird promises(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
});
解决这个问题的一种方法是保留对 jqXHR 对象的引用,以便您以后可以访问它:
var jqXHR = $.get(...);
Promise.resolve( jqXHR ).then( function ( data ) {
var headers = jqXHR.getAllResponseHeaders();
} );
为什么要将 jqXHR
强制转换为其他 Promise,而在 jQuery 中,jqXHR 作为正式变量可供成功和错误处理程序使用?
$.get(...).then(function(data, testStatus, jqXHR) {
var headers = jqXHR.getAllResponseHeaders();
...
}, function(jqXHR, testStatus, errorThrown) {
var headers = jqXHR.getAllResponseHeaders();
...
});
如果出于某种原因您仍然需要强制执行 jqXHR,则将整个表达式包装在 Promise.resolve(...)
中。 .then()
返回的 jQuery 承诺与 jqXHR 一样具有强制性。
我正在使用 bluebird.js 解析 jquery ajax 请求,但访问我请求的 http headers 出奇地困难。
示例代码:
Promise.resolve($.get(...)).then(function(data){
//wtb http headers
});
我正在尝试访问随我的响应返回的 http headers。仅根据 ajax 请求执行此操作很简单,我想比我聪明的人已经想出了这个承诺。
jQuery promises 和 bluebird promises(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
});
解决这个问题的一种方法是保留对 jqXHR 对象的引用,以便您以后可以访问它:
var jqXHR = $.get(...);
Promise.resolve( jqXHR ).then( function ( data ) {
var headers = jqXHR.getAllResponseHeaders();
} );
为什么要将 jqXHR
强制转换为其他 Promise,而在 jQuery 中,jqXHR 作为正式变量可供成功和错误处理程序使用?
$.get(...).then(function(data, testStatus, jqXHR) {
var headers = jqXHR.getAllResponseHeaders();
...
}, function(jqXHR, testStatus, errorThrown) {
var headers = jqXHR.getAllResponseHeaders();
...
});
如果出于某种原因您仍然需要强制执行 jqXHR,则将整个表达式包装在 Promise.resolve(...)
中。 .then()
返回的 jQuery 承诺与 jqXHR 一样具有强制性。