每x秒多个XmlHttpRequests

时间:2012-11-26 23:20:16

标签: javascript xmlhttprequest settimeout setinterval

我需要一些关于我写的代码的帮助.. 我的代码触发了三个异步请求并更新了我页面上的一些内容。 我希望每X秒触发一次这些请求。 我已经看过几个这样的问题,how to schedule ajax calls every N seconds?关于setTimeout或setInterval,但问题是我需要每隔x秒触发一次请求..而我唯一可以想到的是setInterval / settimeout不计算每个电话分开的时间,但只有一次.. 例如

  

如果我在00.00.01 xhr2 at 00.00.02和xhr3 at 00.00.03 xhr1

对于下一次呼叫,每次20秒后,最好的方法是什么?

  

xhr1 00.00.21 xhr2 00.00.22 xhr3 00.00.23

     

xhr1 00.00.41 xhr2 00.00.32 xhr3 00.00.33

我的当前代码也是以这种方式编写的,即在使用回调函数接收到之前的响应之后每个xhr被触发

function request(url, callback){
....
asychronous request
....
callback(responseText);
}

request(url1, function(){
some code
}
request(url2, function(){
some code
}
request(url3, function(){
some code
}

如果建议采用另一种方法进行三次通话,我想知道..

2 个答案:

答案 0 :(得分:2)

由于这是一个错综复杂的场景,我建议你研究一下promises。这不是一个简单的概念,但它可以让您在链接需求和回调之间保持明确的关注点分离。

如果没有承诺,您需要在回调中包含下一个xhr调用。

Promise包含在JavaScript库中,如jQuery或Dojo。

更简单的方案是忘记链接请求:

function allRequests(){
request(url1, function(){some code});
// url2 one second later
setTimeout(function(){request(url2, function(){some code});},1000);
// url3 one more second later
setTimeout(function(){request(url3, function(){some code});},2000);
}
// run the 3 requests every 20 seconds
setInterval(allRequests(),20000);

答案 1 :(得分:1)

有些选择是:

完全同时执行所有三个请求。是否有理由不能同时完成所有三个请求?

setInterval( allRequests, 20000 );

function allRequests() {
   requestOne();
   requestTwo();
   requestThree();
}

使用上一个请求的成功函数链接您的请求。

setTimeout( requestOne, 5000 );

function requestOne() {
   // do request blah blah
   setTimeout( requestTwo, 5000 );
}

function requestTwo() {
   // do request blah blah
   setTimeout( requestOne, 5000 ); // loops back to first request
}

或者在开始时以超时错开您的请求。

setInterval( requestOne, 20000 ); // set first interval to start now
setTimeout( function() {
   setInterval( requestTwo, 20000 ); // set second interval to start one second from now
}, 1000 );
setTimeout( function() {
   setInterval( requestThree, 20000 ); // set third interval to start two seconds from now
}, 2000 );