如何在d3 xhr请求超时时拒绝承诺?

时间:2017-10-25 05:51:57

标签: javascript d3.js promise xmlhttprequest timeout

我想设置一个超时值,这样如果服务器在该特定时间范围内没有响应,那么UI应该向前移动而不是等待响应。到目前为止,我使用了以下语法,但UI被挂起等待响应。如何指定回调以重置值并通知UI不再需要等待。

q.promise(function(resolve, reject) {
  d3.xhr(my_url)
    .header('Content-Type', 'text/xml')
    .timeout(2000)
    .send(this.my_method, my_xmlData, function(error, data) {
    })
});

我读到here d3 xhr现在支持超时功能。如何在请求超时时使用它并执行回调?谁能告诉我如何正确使用它?我尝试使用

.ontimeout(function(){console.log('request timedout!!'}) 

但它不起作用。

我正在使用promises,所以我想在超时的情况下拒绝承诺。并且我想传递UI接收的相同值,以防我收到服务错误。基本上是空值,以便它稳定下来。但是在超时的情况下,UI不会收到任何值,我的屏幕加载器会继续运行。

TIA。

1 个答案:

答案 0 :(得分:2)

由于d3 v3不支持超时,你可以像这样超时:

var url = "https://mysafeinfo.com/api/data?list=englishmonarchs&format=xml";
let pr = new Promise(function(resolve, reject) {
  var xhr = new XMLHttpRequest();
  xhr.responseType = 'document';
  xhr.overrideMimeType('text/xml');
  xhr.open('GET', url, true);
  xhr.timeout = 1; // time in milliseconds
  xhr.onload = function(d) {
    console.log("load", xhr.responseXML)
    resolve(xhr.responseXML)
  };

  xhr.ontimeout = function(e) {
    console.log("timeout")
    reject({message: "I got timed out"});    
  };

  xhr.send(null);
});
pr.then(function(data) {
  console.log(data)
}, function(err) {
  console.log(err)
})

提供更高的超时工作代码here

如果您使用d3.v4,则可以使用超时工作代码here