【发布时间】:2015-09-02 08:23:27
【问题描述】:
我每秒向服务器发送一个XMLHttpRequest,服务器将响应新消息。为了每秒调用一次XMLHttpRequest,我在SharedWorker 中使用setInterval() 函数。
但是,由于我每秒都在发出请求,所以我想知道setInterval() 是否是异步的?
例如,如果一个 XMLHttpRequest 请求“由于延迟”需要 3 秒才能完成,我会同时处理 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);
【问题讨论】:
-
它是异步的,但是你不会有 3 个请求同时进行,因为函数间隔是 1 秒。无论如何,提供的函数将每秒执行一次。
-
@MinusFour 那么我将至少有 2 个同时进行。如果服务器需要 10 秒来响应,那么请求将不断出现。我怎样才能防止这种情况发生?
-
你可以通过承诺来做到这一点,如果问题是如何间隔承诺,我可以提供答案。
-
@MinusFour 它们可能是需要“大量时间”的请求..
-
setInterval尝试最好以“n * 持续时间”间隔运行。但这与核心误解无关:“setInterval() 会等到第一个请求完成吗?”不,不像想象的那样。从setInterval开始的所示 XHR 代码是 异步 并且将“几乎立即完成”;因此,如果 setInterval 等待(因为 异步代码已经完成运行)或者它如何为下一次超时安排自己,它甚至都无关紧要。
标签: javascript jquery asynchronous xmlhttprequest setinterval