Поэтому я пытаюсь использовать свойство 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
Любые предложения о том, как достичь моей цели, или точка в какой-то литературе, которая мне помогла бы, будут весьма признательны.
Спасибо!
Проблема в том, что вы вызываете pullRequest
:
xhr.ontimeout = pullRequest()
// ------------------------^^
Так как он сразу вызывает себя, затем снова вызывает себя и снова вызывает себя и т.д., В конце концов он заканчивается из стека, когда достигается максимальный уровень рекурсии среды.
Вы не хотите называть его там, вы просто хотите назначить ссылку на функцию ontimeout
чтобы, если время ожидания происходит, ваша функция ontimeout
:
xhr.ontimeout = pullRequest
// No () ------------------^
if (this.readyState == 4 && this.status == 200) {
вместо толькоthis.readyState === 4
потому что он проверяет только, завершено ли это, а не если это удалось.;
или не используйте их и полагайтесь на автоматическую вставку точек с запятой; не смешивать и сочетать. :-) 2.()
вask = (json.result.Ask);
не служат цели вообще.