【问题标题】: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 一样具有强制力。

      【讨论】:

        猜你喜欢
        • 2014-02-15
        • 2018-07-19
        • 2015-10-01
        • 1970-01-01
        • 2011-03-06
        • 1970-01-01
        • 2016-08-08
        • 2018-11-13
        相关资源
        最近更新 更多