0

私は書いているいくつかのコードについて助けが必要です..私のコードは3つの非同期リクエストを起動し、私のページのいくつかのコンテンツを更新します. これらのリクエストを X 秒ごとに起動したい.. このような質問をいくつか見たことがあります。N 秒ごとに ajax 呼び出しをスケジュールする方法は? setTimeoutまたはsetIntervalに関してですが、問題は、各リクエストをx秒ごとに起動する必要があることです..一方、そのsetInterval/settimeoutを考えることができるのは、呼び出しごとに個別の時間をカウントしないだけですが、1回だけ..実例

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
}

3 つの呼び出しに対して別のアプローチも提案されている場合は、知りたい..

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

いくつかのオプションは次のとおりです。

3つのリクエストすべてをまったく同時に実行します。3つのリクエストすべてを同時に実行できない理由はありますか?

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 に答える