Как отклонить обещание на тайм-аут запроса d3 xhr?

1

Я хочу установить значение тайм-аута, чтобы, если сервер не отвечает в этот конкретный временной интервал, тогда пользовательский интерфейс должен двигаться вперед и не ждать ответа. До сих пор я использовал синтаксис ниже, но пользовательский интерфейс повесился, ожидая ответа. Как я могу указать обратный вызов для сброса значений и информировать пользовательский интерфейс, который больше не нужно ждать.

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

Я читал здесь, что d3 xhr теперь поддерживает функцию тайм-аута. Как использовать это и выполнять обратный вызов при истечении времени запроса? Может ли кто-нибудь рассказать мне, как правильно использовать это? Я попытался использовать

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

но это не сработало.

Я использую обещания, поэтому я хочу отказаться от обещания в случае тайм-аута. И я хочу передать UI те же самые значения, которые он получает, если я получаю сообщение об ошибке. В основном нулевые значения, чтобы он опустился. Но в случае таймаута пользовательский интерфейс не получает никаких значений, и мой загрузчик экрана работает.

ТИА.

  • 0
    Какая версия D3? Я думаю, что Xhr из v.3, но документ, с которым вы связаны, v.4.
  • 0
    @Mark_M Я использую 3.5.5! Но тайм-аут работает и с ним!
Показать ещё 3 комментария
Теги:
d3.js
xmlhttprequest
promise
timeout

1 ответ

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

Предоставление выше тайм - аут рабочего кода здесь

Если вы используете d3.v4, вы можете использовать рабочий код тайм-аута здесь

Ещё вопросы

Сообщество Overcoder
Наверх
Меню