我有用户选择的行列表,我想逐个删除它们,并在最后显示结果。
显然,如果我只做简单的循环并且每次调用ajax函数,但是我如何循环并检查哪一个成功,哪一个失败以及什么时候完成?
你会怎么做?什么是批量编辑/删除的正确方法?答案 0 :(得分:9)
每个ajax请求都会产生与之相关的开销。为每一行打电话是一个坏主意,因为它可能会使请求超载服务器,如果您收到足够的流量,您可以DoS yourself。此外,所有浏览器都限制一次可以发出多少HTTP请求,因此(取决于浏览器),删除将以突发形式发生,而不是一次性发生,即使您告诉它们一个接一个地执行。 / p>
您最好的选择是将行编辑/删除成JSON数组,并在单个请求中将它们发送到服务器。然后,在服务器上,您可以解析JSON并相应地删除项目。完成后,返回包含结果的JSON数组。
此jQuery伪代码代码假设您要么使用本机JSON object定位浏览器,要么使用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有events for success
and failure
,您可以使用它来处理请求的一般成功或失败,我建议您使用。
继续上面的代码,这是处理删除记录的一种方法。为简单起见,我在此处使用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
}
}
});
回应评论: