我每秒向服务器发送一个XMLHttpRequest
,服务器将响应新消息。要每隔XMLHttpRequest
拨打setInterval()
,请使用SharedWorker
内的setInterval()
功能。
但是,由于我每秒都在提出请求,我想知道XMLHttpRequest
是否异步?
例如,如果一个setInterval()
请求需要3秒才能完成"由于延迟",我会同时发出3个请求,或者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);
会等到第一个请求在等待1秒之前完成并发送另一个请求?
这是我的代码
config_<env>.js
答案 0 :(得分:5)
正如所指出的,它不会等到请求完成。这是一种区分承诺的方法:
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秒,它将自行延迟。
答案 1 :(得分:3)
是的,你会遇到麻烦。无论您的请求状态如何,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')
答案 2 :(得分:1)
setInterval
只需将代码排队,即可在当前调用堆栈执行完毕后运行。这对某些事情很有用。
所以是的,它是异步的,因为它打破了同步流,但实际上并不是在一个单独的线程上并发执行。如果您的目标是后台处理,请查看webworkers。
因此,无论服务器花费多少时间,它都会根据您的代码设置每秒请求1000
答案 3 :(得分:0)
是的setInterval&amp; setTimeout是异步的,但如果你想要读取有关Web套接字的推送请求,你就不要进行推送,你可以进行推送