我有行列表,用户选择,我想要删除它们,一个接一个地显示结果。jquery正确的方式来批量阿贾克斯请求
显然,如果我只是做简单的循环和每次调用ajax函数,但我怎样才能循环和检查哪一个成功,哪一个失败,什么时候全部完成?
你会怎么做?做批量编辑/删除的正确方法是什么?
我有行列表,用户选择,我想要删除它们,一个接一个地显示结果。jquery正确的方式来批量阿贾克斯请求
显然,如果我只是做简单的循环和每次调用ajax函数,但我怎样才能循环和检查哪一个成功,哪一个失败,什么时候全部完成?
你会怎么做?做批量编辑/删除的正确方法是什么?
每个ajax请求都会有相关的开销。对每一行打电话都不是个好主意,因为它可能会使请求超出服务器,如果您接收到足够的流量,则可以使用DoS yourself。此外,所有浏览器都可以同时创建多少个HTTP请求,因此(取决于浏览器),即使您告诉它们一个接一个地执行,删除也会以突发形式发生,而不是一次全部发生。
您最好的选择是将行编组/编辑/删除到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
}
}
});
在回应评论:
让我问你这个问题。如果您正在构建像gmail或应用程序(如闪烁)的应用程序,并假设用户选择了20行并发送移动/删除,您是否会检查每个选定的行是否被删除,或者您是否假设所有行都被删除从服务器获得成功响应或从服务器获取错误响应以了解出现问题的原因? – Basit 2009-10-31 02:42:57
以及如果黑客尝试使用劫持方法,这意味着像获取其他人的ID并将其推入其ID内,所以其他人的媒体也被删除..(我假设你会说要检查每个ID,然后删除它),但你看起来很专业,知道很多,所以我想问你你会做什么。 – Basit 2009-10-31 02:45:05
您在评论中提出了一些复杂的问题。我已经更新了我的答案,以回应他们,因为600个字符没有足够的空间来回答完整。 – 2009-10-31 03:15:34
为什么不收集要删除和做一个质量要求删除ID列表中的项目的所有的ID? – PetersenDidIt 2009-10-31 02:26:23
检查我的问题下丹herbert答案 – Basit 2009-10-31 02:45:53