在使用Promises发出ajax请求时如何访问http标头?

时间:2015-07-22 22:24:35

标签: javascript jquery ajax promise bluebird

我使用bluebird.js解析jquery ajax请求,并且访问我的请求的http标头非常困难。

示例代码:

Promise.resolve($.get(...)).then(function(data){    
    //wtb http headers
});

我正在尝试访问我的响应返回的http标头。仅仅根据ajax请求执行此操作很简单,我认为比我聪明的人已经将这一点想象出来了。

3 个答案:

答案 0 :(得分:4)

解决此问题的一种方法是保持对jqXHR对象的引用,以便稍后访问:

var jqXHR = $.get(...);

Promise.resolve( jqXHR ).then( function ( data ) { 
    var headers = jqXHR.getAllResponseHeaders();
} );

答案 1 :(得分:2)

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
});

答案 2 :(得分:1)

为什么通过保持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一样具有强制性。