0

データを投稿し、OK\Problem でメッセージを表示する ajax 関数があります。

$.ajax({
            url: 'save.php',
            type: "POST",
            data: jsObj
            //contentType: "application/json"
        })
      .success(function (result)
      {

      var status = result.split(";")[0];
      var msg = result.split(";")[1];
      if ((status == "Ok") && ($('#divMsg').css('display') == 'none'))
      {
          //console.log($('#divMsg').css('display'));
          $("#divMsg").toggle("slow");
          $("#divMsg").find("p").text("Saved");
      }
       (...)

問題は、1 秒間に数回呼び出される可能性があるため、複数回保存されたという div が表示されることです。一度だけ見せてほしい。div が非表示になっているかどうかを確認しようとしましたが、それはあまりにも速く発生する必要があり、次のメッセージで引き続き表示されます。

ロック機構を手に入れる方法はありますか?

4

3 に答える 3

2

ワーカー タスクを明示的に作成しない限り、クライアントの Javascript はシングル スレッドです (すべてのブラウザーがそれをサポートしているわけではありません)。おそらく、未処理のリクエストの数を追跡する変数をどこかに保持し、最後のリクエストが完了したときにのみ結果を出力することをお勧めします。

出力要素にカウンターを保持することは適切なアイデアですが、それは単なる true/false フラグではなく、カウンターであるべきです。一度に複数のリクエストを処理し、最後のリクエストが解決された後にのみ結果を表示することをお勧めします。

// save the divMsg element, since we're going to use it a few times.
var divMsg = $("#divMsg");
var count = divMsg.data('pendingRequests');
divMsg.data('pendingRequests', count ? count+1 : 1); // increment the count, or set it to 1

$.ajax({
    url: 'save.php',
    type: "POST",
    data: jsObj
}).done(function (result) {
    var status = result.split(";")[0];
    var msg = result.split(";")[1];
    if ((status == "Ok") && (divMsg.css('display') == 'none')) {
        // if this is the last request, print the status
        if (divMsg.data('pendingRequests') == 1)
            divMsg.toggle("slow").find("p").text("Saved");
    }
    (... etc ...)
}).always( function(result) {
    // decrement the pending request count.
    var count = divMsg.data('pendingRequests');
    divMsg.data('pendingRequests', count-1);
});

fail()ハンドラーを追加して、失敗情報を出力することもできます。

于 2013-07-02T23:37:44.617 に答える