0

我需要一些关于我正在编写的代码的帮助。我的代码会触发三个异步请求并更新我页面上的一些内容。我希望这些请求每 X 秒触发一次。我见过几个这样的问题,如何安排每 N 秒一次的 ajax 调用?关于 setTimeout 或 setInterval,但问题是我需要每 x 秒触发一次每个请求..而我唯一能想到的 setInterval / settimeout 不会计算每个调用的单独时间,而是一次..实例

如果我在 00.00.01 有 xhr1,在 00.00.02 有 xhr2,在 00.00.03 有 xhr3

下一个呼叫最好在每个 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
}

如果对这三个电话也提出了另一种方法,我想知道..

4

2 回答 2

2

由于这是一个复杂的场景,我建议您查看promises。这不是一个简单的概念,但它可以让您在链接需求和回调之间保持清晰的关注点分离。

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

Promise 包含在 jQuery 或 Dojo 等 JavaScript 库中。

一个更简单的场景是忘记链接请求:

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);
于 2012-11-27T00:35:12.467 回答
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 );
于 2012-11-27T01:15:24.337 回答