首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jquery批量ajax请求的正确方法

jquery批量ajax请求的正确方法
EN

Stack Overflow用户
提问于 2009-10-31 09:41:01
回答 1查看 3K关注 0票数 0

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

显然,如果我只是执行简单的循环并调用每次ajax函数,但是我如何循环并检查哪个成功,哪个失败,以及它们何时都完成了呢?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-10-31 10:19:53

每个ajax请求都会有与之相关的开销。为每一行进行调用不是一个好主意,因为这可能会使服务器因请求而过载,并且如果您收到足够的流量,则可以使用DoS yourself。此外,所有浏览器都有一次可以发出多少个HTTP请求的限制,因此(取决于浏览器),删除将突然发生,而不是一次全部删除,即使您告诉它们一个接一个地执行。

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

这段jQuery伪代码假定您使用的是原生JSON object的浏览器,或者您使用的是json2.js。基本上,这段代码只是在您向用户显示的表的每一行中查找“隐藏ID”字段,并将其添加到一个数组中。您可以根据需要对其进行调整。

代码语言:javascript
复制
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事件都会发生。

代码语言:javascript
复制
$.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使用一个带有I数组的AJAX请求。不会发回单个状态代码。看起来(我在这里猜测) Gmail会为你刚刚执行的操作返回一个"action ID“,所以你可以通过单击一个撤销链接来撤销这个操作,这个链接在你删除一封邮件后会短暂出现。
  • 在使用应用程序时,您通常希望使其足够可靠,以确保操作不会失败。您应该执行严格的QA来确保这一点。基本上,删除操作应该作为一个整体通过或失败。一种可能发生这种情况的情况是,当您的服务器关闭时,用户单击delete。对于用户来说,站点仍然在运行,因为您没有重新加载页面,但是AJAX请求将失败,因为它没有地方可去。你会想要处理这样的事情。
  • 这真的取决于你的应用程序的业务规则。如果您的应用程序在多个人可以同时更改记录的情况下使用(仅举个例子),则一个用户试图删除的内容可能已被其他用户在单击“删除”按钮之前删除。在大多数情况下,我看不到人们关心谁先删除了记录,因为如果它被删除了,它就被删除了,无论是谁真正做的。但是,业务规则可能规定(尽管很荒谬)您需要将此信息报告给用户。在这种情况下,您必须返回每个deletion.

的状态数组

  • 为了防止黑客删除其他人的记录,有几件事要做:
    • 对待您的AJAX处理程序与站点的其他处理程序没有区别。他们不应该得到任何特殊的特权。
    • 使用POST请求(正如我在示例中提到的),用于破坏性操作或更改数据的操作。这将使黑客更难执行Cross-Site Request Forgeries (CSRF)。显然,这不是一件万无一失的事情,但它阻止了easy exploits.
    • Obviously,不会因为用户发送了删除请求就假定用户有权删除记录。确保验证执行删除操作的用户有权删除每条记录。如何做到这一点将取决于您的服务器端application.
    • Make确保您编码了从客户端发送到服务器的所有值。这将阻止SQL injections.
    • Make确保您熟悉OWASP Top Ten list。它涵盖了网站上最常见的(但不是所有的)主要漏洞,并解释了如何防止成为them.

的受害者

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1653127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档