私は、タイムアウト時にサーバーをポーリングするチャット アプリケーションに取り組んでいます。時間の経過とともに最近のアクティビティがない場合、タイムアウトは増加します。この関数loadNew()
はサーバーに対して ajax 呼び出しを実行し、サーバーはメッセージ データで応答します。
pollTimeoutTime = 500;
function poll() {
pollTimeout = setTimeout(function(){
loadNew();
if (!new_messages_count) {
//Increasing delay between polls as no messages are incoming to a maximum of 1 minute/60 seconds
if (pollTimeoutTime < 60000) pollTimeoutTime = pollTimeoutTime * 1.25;
}
else {
//Reset delay between poll to default of 0.5 seconds
pollTimeoutTime = 500;
}
poll();
},pollTimeoutTime);
}
私が抱えている問題は、タイムアウト関数が関数のloadNew()
完了を待たないことです。これにより、関数内の ajax 呼び出しが完了するのにかかる時間よりもタイムアウトが短い場合、同じポーリングが 2 回以上送信されます。 . したがって、サーバーは同じデータで複数回応答するため、チャットでメッセージが重複して表示されます。
loadNew()
データの取得と表示が終了した後にのみタイムアウトをトリガーする方法はありますか?
編集: @Brad M の回答を使用した後、メッセージが重複しなくなりました。ユーザーがメッセージを送信した後にポーリングを呼び出す方法が必要なため、新しいメッセージがすぐに表示されます。これは で設定されたタイムアウトに干渉し、loadNew()
メッセージが再び複製される原因となります。それを機能させる方法を考えてもらえますか?