使用 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 一样具有强制性。