ajaxを使用してデータベースから値をフェッチする非同期JavaScriptコードに問題があります。
基本的に、私がやりたいのは、リストが入力されたらページを更新することです。そのために、リストに入力する関数に次のコードを挿入してみました。
var timer1;
timer1 = setTimeout([refresh function], 1000);
ご想像のとおり、これはリストの作成にかかる時間が1秒未満の場合は正常に機能しますが、それより長くかかる場合は問題が発生します。そのため、各ajax呼び出しの成功時に呼び出される関数にこのコードを挿入するというアイデアがありました。
clearTimeout(timer1);
timer1 = setTimeout([refresh function], 1000);
したがって、理論的には、リスト要素がフェッチされるたびにタイマーがリセットされます。つまり、最後のリスト要素が正常に取得されてから1秒後にのみrefresh関数が呼び出されます。ただし、実行時に発生するのは、timer1が1回リセットされ、最初にコードの2番目のブロックに到達したときだけです。
誰かが問題が何であるかを見ることができますか?または、これを行うためのより良い方法がある場合はどうなりますか?ありがとう。
==========
編集:私のajax呼び出しがどのように機能するかを明確にするために:コードの構造に関する問題の1つは、ajax呼び出しが実際にネストされていることです。元のajax呼び出しのコールバックメソッドはそれ自体が別のajax呼び出しであり、そのコールバックメソッドにはデータベーストランザクションが含まれています(不正解-以下を参照)。さらに、このような2つのメソッドを同時に実行しています。私が必要としているのは、ページを更新する前に、すべてのレベルのすべての呼び出しが完了していることを確認する方法です。これが、両方のメソッドに1つのタイマーを与え、コールバックメソッドの1つが呼び出されるたびにリセットすると、すべてのスレッドが完了するまで実行をプッシュし続けると思った理由です。
正直なところ、コードは非常に複雑で(補助メソッドを含めて約140行)、ここに投稿するのは現実的ではないと思います。申し訳ありませんが、コードなしで誰も助けられない場合は、おそらく私は弾丸を噛んで、ある種の意味のある形式でここにコピーしてみます。
==========
EDIT2:メソッドが実行しようとしていることの一般的なワークフローは次のとおりです。この関数は「同期」関数であり、サーバーとの間でデータを送信したり、サーバーからデータを取得したりします。
- I.ローカルデータベースからアイテムを取得する関数が呼び出されます
- 私。アイテムがフェッチされるたびに、サーバー(ajax)に送信されます
a。ajaxがコールバックすると、アイテムはローカルで更新され、成功/失敗が反映されます。
II。アイテムの(個別の)リストがローカルデータベースから取得されます
- 私。アイテムがフェッチされるたびに、そのアイテムのIDに一致するアイテムがサーバー(ajax)からフェッチされます。
- a。サーバーからのフェッチが成功すると、アイテムが比較されます
- b。サーバー側のアイテムが最近のものである場合、ローカルアイテムが更新されます
したがって、上記の2番目のコードブロックを挿入した場所は「i」にあります。各メソッドのセクション、つまり、ajaxが(繰り返し)コールバックする必要があるセクション。上記のコメントに誤りがあったことに気づきました。実際には、ネストされたajax呼び出しはありませんが、データベーストランザクション内のajax呼び出し内のデータベーストランザクションがあります。