0

.each() ループ内の jQuery で AJAX を使用しているときに問題が発生していることに気付きました。スクリプトを実行すると、データベースの最初のレコードのみが更新されます。

これが私のスクリプトです:

function save(){
            var _userTypeId;
            var _userTypeName;
            var _isDeleted;
            var request;

            $("tr.recUserType").each(function(){
                $this = $(this);
                _userTypeId = $this.find("#userTypeId").html();
                _userTypeName = $this.find("#userTypeName").val();
                _isDeleted = $this.find("#isDeleted").val();

                request = $.ajax({
                    url: "save.php",
                    type: "POST",
                    data: {userTypeId: _userTypeId, userTypeName: _userTypeName, isDeleted: _isDeleted}
                });
            });

            request.done(function(){
                document.location.reload();
            });

            request.fail(function(){
                alert("Request Failed!");
            });
        }

そして、save.php の内容:

<?php
include_once "globals.php";

dbConnect();

$isExisting = mysql_query("SELECT COUNT(userTypeId) AS userCount FROM userType WHERE userTypeId='".$_POST['userTypeId']."';");

$result = mysql_fetch_array($isExisting);

//original: if(!$result['userCount'] = 0) <-- This was a logical error
if($result['userCount'] != 0)
    mysql_query("UPDATE userType SET userTypeName='".$_POST['userTypeName']."', isDeleted='".$_POST['isDeleted']."' WHERE userTypeId='".$_POST['userTypeId']."';");
else
    mysql_query("INSERT INTO userType VALUES('', '".$_POST['userTypeName']."', '".$_POST['isDeleted']."');");

echo mysql_error();

dbClose();
?>

非同期ではなく同期を使用するオプションがあることを読みましたが、それは良い習慣ではないことも読みました。

では、実際にこれを非同期で実行して問題を解決するにはどうすればよいでしょうか?

4

3 に答える 3

0

問題は次のコード ブロックにあります。

request.done(function(){
    document.location.reload();
});

アクションは非同期であるため、この行は保存が完了する前に実行され、最初の保存が完了した後にdoneロジックが実行されます。

.when()/.then()jQuery関数を使用してロジックを進める前に、すべてのオブジェクトが実行されるまで待機できる遅延オブジェクトの配列を作成する必要があります。

これは、この状況をセットアップする方法を詳しく説明した以前の StackOverflow の質問です。各トリガー関数が完了したら、jQueryの受け入れられた回答をお読みください。

于 2013-07-28T03:43:39.750 に答える