ユーザーが選択した行のリストがあり、それらを1つずつ削除して、最後に結果を表示したい。
明らかに、単純なループを実行して毎回 ajax 関数を呼び出すだけの場合、どのようにループして、どれが成功し、どれが失敗し、それらがすべて完了したかを確認するにはどうすればよいですか?
どのようにしますか?一括編集/削除を行う適切な方法は何ですか?
各 ajax リクエストには、関連するオーバーヘッドがあります。サーバーがリクエストで過負荷になる可能性があり、十分なトラフィックを受信した場合にDoSを行う可能性があるため、各行に対して呼び出しを行うことはお勧めできません。また、すべてのブラウザーには、一度に作成できる HTTP 要求の数に制限があるため、(ブラウザーによっては) 次々に実行するように指示したとしても、削除は一度にではなくバーストで行われます。
最良のオプションは、編集/削除する行を JSON 配列にグループ化し、それらを単一の要求でサーバーに送信することです。その後、サーバーで JSON を解析し、それに応じてアイテムを削除できます。終了したら、結果を含む JSON 配列を返します。
この jQuery 疑似コード コードは、ネイティブJSON オブジェクトを使用してブラウザーをターゲットにするか、またはjson2.jsを使用していることを前提としています。基本的に、このコードは、ユーザーに表示するテーブルの各行で「隠し ID」フィールドを検索し、それを配列に追加するだけです。これは、必要に応じて調整できます。
var recordsToDelete = [];
$("tr.myRow").each(function() {
var id = $(this).find("input:hidden").val();
recordsToDelete.push(id);
});
var json = JSON.stringify(recordsToDelete);
結果に対処するのは難しい場合があります。(成功した場合) すべての行が削除されるように、システムを設計する必要があります。非常に複雑なシステムを扱っている場合を除き、一部の行が成功し、一部の行が失敗するという状況は決して発生しないはずです。これが発生した場合は、システム アーキテクチャを再検討する必要があります。jQuery には、リクエストの一般的な成功または失敗に対処するために使用できるおよびのイベントがあります。使用することをお勧めします。success
failure
上記のコードに引き続き、これはレコードの削除を処理する 1 つの方法です。complete
ここでは単純化のためにイベントを使用していますが、可能であればsuccess
およびイベントを使用する必要があります。リクエストが成功するか失敗するかに関係なく、イベントは常に発生しますfailure
。complete
$.ajax({
url: "http://stackoverflow.com/questions/1653127",
type: "POST", // Always use POST when deleting data
data: { ids: json },
complete: function(xhr, status) {
var response = JSON.parse(xhr.responseXML);
// Response will be an array of key/value
// pairs indicating which rows succeeded or failed
for (var i = 0; i < response.length; i++) {
var recordID = response[i].recordID;
var status = response[i].status;
// Do stuff with the status codes here
}
}
});
コメントへの対応: