1

我的应用正在从客户端的 Google 联系人 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()
4

2 回答 2

7

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

于 2013-11-07T22:14:48.107 回答
3

大多数现代浏览器将同时请求限制为每个域 6 个。在其中一个活动请求完成之前发出的请求将被阻塞,从而为队列中的下一个请求释放连接。如果活动请求花费的时间足够长(阅读,“太长”),挂起的请求将超时,就像你看到的那样。

要正确处理此问题,您确实需要滚动自己的请求管理代码。一次只发出浏览器可以处理的请求数。当请求完成、出错或超时时,发出下一个请求。这需要维护一个待处理请求队列并准确检测请求何时完成或完成,但应该可以做到这一点。

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

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

于 2013-11-07T22:17:12.643 回答