1

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呼び出し内のデータベーストランザクションがあります。

4

1 に答える 1

1

これまでのところ、あなたはとてもうまくやっています。使用したいトリックは、次のようにイベントを連鎖させることです。

function refresh()
{
    invokeMyAjaxCall(param1, param2, param3, onSuccessCallback, onFailureCallback);
}

function onSuccessCallback()
{
    // Update my objects here

    // Once all the objects have been updated, trigger another ajax call
    setTimeout(refresh, 1000);
}

function onFailureCallback()
{
    // Notify the user that something failed

    // Once you've dealt with the failures, trigger another call in 1 sec
    setTimeout(refresh, 1000);
}

ここでの問題は、呼び出しが失敗した場合はどうなるかということです。理想的には、サーバーからの情報を継続的に更新していることを確認し、一時的な障害が発生した場合でも続行したいようです。

ここでは、AJAX ライブラリでエラー コールバックを実行できると想定しています。ただし、失敗も成功もせずにライブラリがハングするケースをいくつか見てきました。必要に応じて、別の一連のロジックを使用して、サーバーとの接続が中断されたかどうかを判断し、コールバック シーケンスを再開する必要がある場合があります。

編集:あなたが抱えている問題は、最初の呼び出しが完了する前に次の呼び出しをキューに入れたことの結果であると思われます。基本的に、競合状態を設定しています。次の呼び出しがトリガーされる前に最初の呼び出しを終了できますか? ほとんどの場合に機能する場合もあれば、一度だけ機能する場合もあれば、ほぼ常に機能する場合もあります。ただし、setTimeout() が「応答処理」コードの最後のステートメントでない限り、この種の競合状態は常に潜在的な問題になります。

于 2012-08-09T19:16:27.877 に答える