【问题标题】:How to Handle A Large Series of AJAX Requests ( > 1000)如何处理大量 AJAX 请求 (> 1000)
【发布时间】:2013-11-19 19:01:43
【问题描述】:

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

【问题讨论】:

  • 这需要在客户端完成吗?似乎它更适合服务器。
  • 为什么不执行一个包含所有数据的请求?
  • 不要拨打 1000+ 电话 - 这会浪费网络资源并且速度很慢。将整个列表处理成一个 JSON 数组并一次性发布整个列表。
  • 似乎应该像zerkms所说的那样在单个请求中进行。创建和销毁连接的开销会让您感到沮丧。
  • 为什么要遍历所有 700 个联系人并为每个联系人创建一个新联系人?为什么不在一个请求中一次创建所有 700 个?

标签: javascript jquery ajax backbone.js express


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-29
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 2014-08-25
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      相关资源
      最近更新 更多