Является ли setInterval() асинхронной функцией?

Я делаю XMLHttpRequest каждую секунду серверу, сервер будет отвечать новыми сообщениями. Чтобы вызвать XMLHttpRequest каждую секунду, я использую функцию setInterval() внутри SharedWorker.

Однако, поскольку я делаю запрос каждую секунду, я хотел бы знать, является ли setInterval() асинхронным или нет?

Например, если один запрос XMLHttpRequest занял 3 секунды, чтобы завершить "из-за задержки", у меня будет три запроса одновременно или будет setInterval() ждать, пока первый запрос не завершится до того, как он заберет 1 секунду и отправить другой запрос?

Вот мой код

function checkQueue(url)
{
 var xhr = new XMLHttpRequest();
 xhr.addEventListener("load", reqListener);
 xhr.open('GET', url, true);
 xhr.send();
}
function reqListener ()
{
 var queue = JSON.parse(this.responseText);
 notifyAllPorts(queue);
 console.log(this.responseText);
}
setInterval(
 function() {
 checkQueue('/add-ons/icws/push.php') 
 }
, 1000);
4 ответа

Как указано, он не будет ждать, пока запрос будет выполнен. Здесь можно отложить обещание:

function checkQueue(url, cb) {
 var xhr = new XMLHttpRequest();
 xhr.addEventListener("loadend", cb);
 xhr.addEventListener("load", reqListener);
 xhr.open('GET', url, true);
 xhr.send();
 }
function reqListener ()
{
 var queue = JSON.parse(this.responseText);
 notifyAllPorts(queue);
 console.log(this.responseText);
}
 var promise = Promise.resolve(true);
 setInterval(function () {
 promise = promise.then(function () {
 return new Promise(function (resolve) {
 checkQueue(yourUrlHere, resolve);
 });
 });
 }, 1000);

Он будет продолжать добавлять запросы, чтобы делать каждую секунду, но он будет задерживаться, если он пройдет более 1 секунды.


Да, у тебя проблемы. setInterval будет работать как часы, независимо от состояния ваших запросов.

Вы можете начать таймер с одним ударом, используя setTimeout по завершении каждого запроса... так:

function checkQueue(url)
{
 var xhr = new XMLHttpRequest();
 xhr.addEventListener("load", reqListener);
 xhr.open('GET', url, true);
 xhr.send();
}
function reqListener ()
{
 var queue = JSON.parse(this.responseText);
 notifyAllPorts(queue);
 console.log(this.responseText);
 setTimeout(
 function() {
 checkQueue('/add-ons/icws/push.php') 
 }, 1000);
}
checkQueue('/add-ons/icws/push.php')


setInterval просто ставит в очередь код для запуска после завершения выполнения текущего стека вызовов. Это может быть полезно для некоторых вещей.

Итак, он асинхронен тем, что он прерывает синхронный поток, но на самом деле он не будет выполняться одновременно/в отдельном потоке. Если ваша цель - фоновая обработка, посмотрите на веб-мастеров.

Таким образом, независимо от того, сколько времени сервер занимает, он будет запрашивать каждую секунду, поскольку ваш код установлен на 1000


yes setInterval и setTimeout являются асинхронными, но вы не делаете push, вы делаете pull, если хотите, чтобы запрос push читал о веб-сокетах

licensed under cc by-sa 3.0 with attribution.