setInterval()是一个异步函数吗?

时间:2015-09-01 23:51:33

标签: javascript jquery asynchronous xmlhttprequest setinterval

我每秒向服务器发送一个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

4 个答案:

答案 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套接字的推送请求,你就不要进行推送,你可以进行推送