Использование времени ожидания XMLHttpRequest

1

Поэтому я пытаюсь использовать свойство timeout XMLHttpRequest для "восстановления" моей программы, когда запрос на получение данных истекает. В принципе, если это не удается получить данные, я хочу, чтобы он попытался снова. На данный момент мой код выглядит следующим образом (полный URL-адрес удален, чтобы все было аккуратно):

    function pullRequest(){

        var xhr = new XMLHttpRequest()

        xhr.onreadystatechange = function() {
            if (this.readyState === 4) {
                jsonDecode = this.responseText;
                json = JSON.parse(jsonDecode);
                ask = (json.result.Ask);
                bid = (json.result.Bid);
            }
        }

        xhr.open("GET","<URL>",true);
        xhr.send(); 
}

Я не полностью понимаю, как реализовать свойство тайм-аута, или если он даже собирается делать то, что я хочу. Я добавил следующие две строки после xhr.open но он бросил и заблуждался:

        xhr.timeout = 5000;
        xhr.ontimeout = pullRequest()

В основном в моей голове, если он pullRequest снова запустите функцию pullRequest. Я уверен, что это, вероятно, не очень хорошая идея, но я недостаточно опытен, чтобы понять, почему. Для чего стоит фрагмент ошибки:

...\node_modules\xmlhttprequest\lib\XMLHttpRequest.js:165
    settings = {
    ^

RangeError: Maximum call stack size exceeded at exports.XMLHttpRequest.open 

Любые предложения о том, как достичь моей цели, или точка в какой-то литературе, которая мне помогла бы, будут весьма признательны.

Спасибо!

  • 1
    Я также рекомендую использовать if (this.readyState == 4 && this.status == 200) { вместо только this.readyState === 4 потому что он проверяет только, завершено ли это, а не если это удалось.
  • 0
    Пара побочных комментариев: 1. Либо пользуйтесь ; или не используйте их и полагайтесь на автоматическую вставку точек с запятой; не смешивать и сочетать. :-) 2. () в ask = (json.result.Ask); не служат цели вообще.
Показать ещё 1 комментарий
Теги:
xmlhttprequest

1 ответ

3

Проблема в том, что вы вызываете pullRequest:

xhr.ontimeout = pullRequest()
// ------------------------^^

Так как он сразу вызывает себя, затем снова вызывает себя и снова вызывает себя и т.д., В конце концов он заканчивается из стека, когда достигается максимальный уровень рекурсии среды.

Вы не хотите называть его там, вы просто хотите назначить ссылку на функцию ontimeout чтобы, если время ожидания происходит, ваша функция ontimeout:

xhr.ontimeout = pullRequest
// No () ------------------^
  • 0
    Простое исправление! Я подозревал, что что-то подобное происходит, но мои ограниченные знания означали, что я не мог понять, в чем проблема. Я протестирую это, хотя мне приходится оставлять свой код запущенным на несколько дней, чтобы получить время, так как API, который я вызываю, довольно надежный.

Ещё вопросы

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