如何检索AMD化Dojo的XHR响应代码(+时间戳)?

时间:2012-08-28 07:36:54

标签: javascript dojo xmlhttprequest

使用“旧”Dojo,可以将第二个参数ioargs传递给Xhr请求的load函数(see Example 6 here)。此ioargs提供了(除其他事项外)请求的时间戳和状态代码。

但是如何通过新的“更清洁”(和向前兼容)Dojo实现这一目标? 不幸的是,我在current documentation找不到任何提示。

以下应该是“new”Dojo的上述示例的端口。但是,ioargs将是未定义的:

require( "dojo/request/xhr", "dojo/dom", "dojo/domReady!",
  function(request, dom){
    // Look up the node we'll stick the text under.
    var targetNode = dom.byId("getLicenseStatus");

    // The parameters to pass to xhrGet, the url, how to handle it, and the callbacks.
    request.get(
      "{{dataUrl}}dojo/LICENSE",
      {
        handleAs: "text",
        preventCache: true
      }
    ).then(
      function(data, ioargs){
        // FIXME: ioargs is undefined
        targetNode.innerHTML = "XHR returned HTTP status: " + ioargs.xhr.status;
      },
      function(error){
        targetNode.innerHTML = "An unexpected error occurred: " + error.response.status + ": " + error.response.text;
      }
    );
  }
);

我需要更改什么才能在加载功能中使用请求的时间戳和状态代码?

1 个答案:

答案 0 :(得分:13)

request会返回特殊的promisesource):

  

从dojo / request调用返回的Promise有一个额外的属性,在标准的promises上没有:响应。此属性是一个承诺,它将解析为更详细地描述响应的冻结对象(如果可用):

     
      
  • url - 用于发出请求的最终URL(附加了查询字符串)
  •   
  • options - 用于发出请求的选项对象
  •   
  • text - 响应中数据的字符串表示
  •   
  • data - 响应中处理的数据(如果指定了handleAs)
  •   
  • getHeader(headerName) - 从请求中获取标头的函数;如果提供者不提供头信息,则此函数将返回null。
  •   

因此,您应该将.then链接到此promise.response以访问所有上述属性:

var promise = request.get("{{dataUrl}}dojo/LICENSE");

promise.response.then(function(response) {
    console.log("status", response.status);
    console.log("url", response.url);
    console.log("data", response.data);
});

请参阅jsFiddle的一个工作示例:http://jsfiddle.net/phusick/6wB2L/