2009-10-31 24 views
0

我有行列表,用户选择,我想要删除它们,一个接一个地显示结果。jquery正确的方式来批量阿贾克斯请求

显然,如果我只是做简单的循环和每次调用ajax函数,但我怎样才能循环和检查哪一个成功,哪一个失败,什么时候全部完成?

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

+1

为什么不收集要删除和做一个质量要求删除ID列表中的项目的所有的ID? – PetersenDidIt 2009-10-31 02:26:23

+0

检查我的问题下丹herbert答案 – Basit 2009-10-31 02:45:53

回答

9

每个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事件,但如果可能的话,您应该使用successfailure事件。无论请求是成功还是失败,总是会发生该事件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应用程序,它的工作方式是如此大规模复杂,说:“因为谷歌做它这样,我会做这种方式” ,不是一个好主意。并非所有适用于Google的方法都适用于每家公司或网站。像谷歌这样的公司在处理这些问题上几乎没有其他网站需要担心。但回答你的问题
    • 我刚刚证实了这一点是肯定的:GMail使用一个带有ID数组的AJAX请求。没有个人状态代码被送回。看起来(我在这里推测)Gmail会为您刚刚执行的操作返回一个“操作ID”,因此您可以通过单击删除电子邮件后短暂显示的撤消链接来撤消该操作。
    • 在使用应用程序时,通常希望使其足够可靠,以便操作不会失败。您应该执行严格的质量检查以确保这一点。基本上,删除操作应该通过或失败作为一个整体。这可能发生的情况是,如果用户在服务器关闭时单击删除。对于用户来说,该网站仍然处于运行状态,因为您没有重新加载页面,但AJAX请求将失败,因为它没有去哪里。你会想要处理这样的东西。
    • 这实际上取决于您的应用程序的业务规则。如果您的应用程序在多人同时更改记录的情况下使用(只是一个示例),则在用户单击“删除”按钮之前,某个用户尝试删除的内容可能已被其他人删除。在大多数情况下,我无法看到关心谁先删除记录的人,因为如果删除了该记录,则会删除该记录,无论是谁真正删除了该记录。但是,业务规则可能会规定(尽可能荒谬)您需要向用户报告此信息。在这种情况下,您将不得不返回每次删除的状态数组。
  • 对于防止黑客删除其他人的记录,有几件事情要做:
    • 对待你的AJAX的处理程序没有区别的网站的其余部分。他们应该没有特别的权限。对AJAX处理程序的请求应该像其他所有一样进行身份验证。
    • 使用POST请求(如我在示例中提到的)破坏性操作或更改数据的操作。这会让黑客难以执行Cross-Site Request Forgeries (CSRF)。显然这不是一件万无一失的事情,但它阻止了简单的利用。
    • 显然,不要假定用户有权仅仅因为用户发送删除请求而删除记录。确保您确认执行删除的用户有权删除每条记录。你如何做到这一点将取决于你的服务器端应用程序。
    • 确保您将所有发送的值客户端编码到服务器。这将防止SQL注入。
    • 确保您熟悉OWASP Top Ten list。它涵盖了网站上最常见的(但不是全部)主要漏洞,并解释了如何防止成为它们的受害者。
+0

让我问你这个问题。如果您正在构建像gmail或应用程序(如闪烁)的应用程序,并假设用户选择了20行并发送移动/删除,您是否会检查每个选定的行是否被删除,或者您是否假设所有行都被删除从服务器获得成功响应或从服务器获取错误响应以了解出现问题的原因? – Basit 2009-10-31 02:42:57

+0

以及如果黑客尝试使用劫持方法,这意味着像获取其他人的ID并将其推入其ID内,所以其他人的媒体也被删除..(我假设你会说要检查每个ID,然后删除它),但你看起来很专业,知道很多,所以我想问你你会做什么。 – Basit 2009-10-31 02:45:05

+0

您在评论中提出了一些复杂的问题。我已经更新了我的答案,以回应他们,因为600个字符没有足够的空间来回答完整。 – 2009-10-31 03:15:34