如何处理大量AJAX请求(> 1000)

时间:2013-11-07 22:09:36

标签: javascript jquery ajax backbone.js express

我的应用程序从客户端的Google Contacts API获取用户的所有Google通讯录。这通常会导致1到2000个不同的JSON对象。当收到这些文件时,我的应用程序会遍历它们,重新格式化每个联系人对象,然后尝试通过POST请求将重新格式化的联系人对象保存到我的数据库。结果是在客户端触发了大量(1 - 2000)的AJAX调用,但是在5-10个调用之后它们就停止了。处理所有这些AJAX请求或一次性保存如此大量数据的最佳方法是什么?

以下是我当前代码的摘要版本:

// gContacts.length = 722

$(gContacts).each(function(index, contact) {

         // Reformat each contact object to fit into my database
         var newContact = {}
         newContact.title = // String
         newContact.emails = // Object featuring different emails
         newContact.phone_numbers = // Object featuring different phonenumbers

         // Save to Database via Backbone
                    var newContact = new App.Collections.Contacts()
                    newContact.create({
                        title           : newContact.title,
                        emails          : newContact.emails,
                        phone_numbers   : newContact.phone_numbers
                    }, {
                        success: function (response) {

                        },
                        error: function (model, xhr) {
                            var errors = $.parseJSON(xhr.responseText).errors
                            console.log(errors)
                        }
                    }) // End .save
}); // End of .each()

2 个答案:

答案 0 :(得分:6)

我会做一个服务器端操作,它需要一个完整的联系人对象列表。然后在客户端,只需格式化它们并将它们全部添加到数组中,一旦完成,就发送数组。你这样做的方式会产生很多不必要的网络开销。

答案 1 :(得分:3)

大多数现代浏览器限制了对6 per domain的同时请求。超出其中的请求将被阻止,直到其中一个活动请求完成,从而为队列中的下一个请求释放连接。如果活动请求花费的时间足够长(读取“太长”),则挂起的请求将会超时,就像您所看到的那样。

要正确处理此问题,您确实需要推送自己的请求管理代码。只能在浏览器处理时同时发出多个请求。当请求完成,错误输出或超时时,发出下一个请求。这需要维护待处理请求的队列,并准确检测请求何时完成或完成,但应该这样做。

您可能遇到的一个问题是您的POST请求将与服务器的所有其他请求竞争。例如,您可能已经注意到,如果您在这些POST请求通过电子邮件时打开另一个页面到您的网站,您的网站将永远不会加载或加载速度非常慢。

正如其他人所说,将这些更新批量处理为单个请求可能是更好的解决方案。