jquery是批量处理ajax请求的正确方法

jquery是批量处理ajax请求的正确方法,ajax,jquery,loops,response,Ajax,Jquery,Loops,Response,我有用户选择的行列表,我想逐个删除它们,并在最后显示结果 显然,如果我只是简单地循环并每次调用ajax函数,那么我如何循环并检查哪一个成功,哪一个失败,以及它们何时全部完成 你会怎么做?批量编辑/删除的正确方法是什么?每个ajax请求都会有相关的开销。为每一行打一个电话是个坏主意,因为这可能会使服务器上的请求过载,如果您收到足够的流量,您也可能会过载。此外,所有浏览器对一次可以发出多少HTTP请求都有限制,因此根据浏览器的不同,删除操作将以突发方式进行,而不是一次完成,即使您让它们一个接一个地执

我有用户选择的行列表,我想逐个删除它们,并在最后显示结果

显然,如果我只是简单地循环并每次调用ajax函数,那么我如何循环并检查哪一个成功,哪一个失败,以及它们何时全部完成


你会怎么做?批量编辑/删除的正确方法是什么?

每个ajax请求都会有相关的开销。为每一行打一个电话是个坏主意,因为这可能会使服务器上的请求过载,如果您收到足够的流量,您也可能会过载。此外,所有浏览器对一次可以发出多少HTTP请求都有限制,因此根据浏览器的不同,删除操作将以突发方式进行,而不是一次完成,即使您让它们一个接一个地执行

最好的选择是将要编辑/删除的行分组到一个JSON数组中,并在一个请求中将它们发送到服务器。在服务器上,您可以解析JSON并相应地删除项目。完成后,返回一个包含结果的JSON数组

此jQuery伪代码假定您的目标浏览器是本机浏览器,或者您正在使用。基本上,这段代码只是在向用户显示的表的每一行中查找隐藏的ID字段,并将其添加到数组中。您可以根据需要对其进行调整

var recordsToDelete = [];
$("tr.myRow").each(function() {
    var id = $(this).find("input:hidden").val();
    recordsToDelete.push(id);
});
var json = JSON.stringify(recordsToDelete);
处理结果可能更难。您应该设计您的系统,以便在成功的情况下删除每一行。除非您处理的是一个非常复杂的系统,否则永远不会出现某些行通过而某些行失败的情况。如果发生这种情况,您需要重新考虑您的系统架构。jQuery提供了一个可用于处理请求的一般成功或失败的方法,我建议您使用它

继续上面的代码,这是处理删除记录的一种方法。为了简单起见,我在这里使用完整事件,但是如果可能,您应该使用成功和失败事件。无论请求成功或失败,始终会发生完整事件

$.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这样的应用来说,它的工作方式非常复杂,所以说我会这样做,因为谷歌这样做,不是一个好主意。并非所有适用于谷歌的东西都适用于每一家公司或网站。像谷歌这样的公司需要解决的问题几乎没有其他网站需要担心。不过,我想回答你的问题 我只是验证了一下:GMail使用一个AJAX请求和一个ID数组。不会发回任何单独的状态代码。我猜Gmail会为你刚刚执行的操作返回一个操作ID,因此你可以通过单击删除电子邮件后短暂出现的撤销链接撤销该操作。 在使用应用程序时,您通常希望使其足够可靠,以确保操作不会失败。您应该执行严格的QA以确保这一点。基本上,删除操作应该作为一个整体通过或失败。如果用户在服务器关闭时单击“删除”,则可能发生这种情况。对于用户来说,站点仍然处于运行状态,因为您没有重新加载页面,但是AJAX请求将失败,因为它没有去向。你会想处理这样的事情。 这实际上取决于应用程序的业务规则。如果您的应用程序在多人可以同时更改记录的情况下使用,例如,一个用户尝试删除的内容可能在单击“删除”按钮之前被其他人删除。在大多数情况下,我看不到有人关心谁先删除了该记录,因为如果该记录被删除,它就被删除了,无论是谁真正删除了它。但是,业务规则可能会规定您需要向用户报告此信息,这可能非常荒谬。在这种情况下,您必须为每次删除返回状态数组。 为了防止黑客删除他人的记录,需要做以下几件事: 对待AJAX处理程序与站点的其他部分没有什么不同。他们不应该得到任何特权。对AJAX处理程序的请求应该像其他所有请求一样得到身份验证。 如我在示例中提到的,将POST请求用于破坏性操作或更改数据的操作。这将使黑客更难执行。显然,这不是一件万无一失的事情,但它阻止了简单的利用。 显然,不要仅仅因为用户发送了删除请求就认为用户有权删除记录。确保您确认执行删除操作的用户有权删除每条记录。如何做到这一点取决于服务器端应用程序。 确保对从客户端发送到服务器的所有值进行编码。这将防止SQL注入。 请确保您熟悉该应用程序。它涵盖了网站上最常见但并非所有的主要漏洞,并解释了如何防止成为攻击的受害者 他们
为什么不收集你想要删除的项目的所有ID,并批量请求删除ID列表?检查dan herbert Answer下面的问题让我问你这个问题。如果您正在构建一个类似gmail或类似flicker的应用程序,假设用户选择了20行并发送用于移动/删除,您会检查每个选定行是否已删除,或者你只是假设所有的行都是通过从服务器获得成功响应或从服务器获得错误响应而被删除的,因为知道发生了错误?如果黑客试图使用劫持方法,比如获取其他人的id并将其推到自己的id中,那么其他人的媒体也会被删除。。我猜你会说检查每个id然后删除它,但是你看起来很专业,知道很多,所以我想问你会怎么做。你在评论中问了一些复杂的问题。我已经更新了我的答案,以回应他们,因为600个字符的空间不足,无法完全回答。非常感谢您的所有答案,您提供了很大帮助。再次感谢你。我想我将要做的是,发送所有id并检查是否所有id都属于用户自己,然后继续请求,不管是否有一个用户无法对其进行管理,这样就不需要检查每个删除的id。但如果任何id不是用户,则返回数组。好的,如果你认为我不应该这样做,请一定要让我知道,如果不应该,我就这么做顺便说一句,再次谢谢你。