我的应用程序从客户端的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()
答案 0 :(得分:6)
我会做一个服务器端操作,它需要一个完整的联系人对象列表。然后在客户端,只需格式化它们并将它们全部添加到数组中,一旦完成,就发送数组。你这样做的方式会产生很多不必要的网络开销。
答案 1 :(得分:3)
大多数现代浏览器限制了对6 per domain的同时请求。超出其中的请求将被阻止,直到其中一个活动请求完成,从而为队列中的下一个请求释放连接。如果活动请求花费的时间足够长(读取“太长”),则挂起的请求将会超时,就像您所看到的那样。
要正确处理此问题,您确实需要推送自己的请求管理代码。只能在浏览器处理时同时发出多个请求。当请求完成,错误输出或超时时,发出下一个请求。这需要维护待处理请求的队列,并准确检测请求何时完成或完成,但应该这样做。
您可能遇到的一个问题是您的POST请求将与服务器的所有其他请求竞争。例如,您可能已经注意到,如果您在这些POST请求通过电子邮件时打开另一个页面到您的网站,您的网站将永远不会加载或加载速度非常慢。
正如其他人所说,将这些更新批量处理为单个请求可能是更好的解决方案。