Javascript 如何通过AJAX发送数千个对象?

Javascript 如何通过AJAX发送数千个对象?,javascript,ajax,performance,jquery,Javascript,Ajax,Performance,Jquery,我正在尝试使用AJAXAPI将100K+记录加载到云服务中。它看起来像这样: var multiple = [{ "Author": "Sample Text" }, { "Author": "Second Sample Text" },...]; $.ajax({ type: "POST", url: 'http://api.cloudservice.com/v1/your-api-key-here/Books', headers: { "Authorization"

我正在尝试使用AJAXAPI将100K+记录加载到云服务中。它看起来像这样:

var multiple = [{ "Author": "Sample Text" }, { "Author": "Second Sample Text" },...];

$.ajax({
    type: "POST",
    url: 'http://api.cloudservice.com/v1/your-api-key-here/Books',
    headers: { "Authorization": "Bearer your-access-token-here" },
    contentType: "application/json",
    data: JSON.stringify(multiple),
    success: function (data) {...},
    error: function (error) {...}
})

当然,我不想发送100K条记录的有效负载,因此我可以一次将其减少到100条。即便如此,在一个循环中这样做仍然是很大的。我将如何创建可靠的AJAX循环来实现这一点,或者以其他方式实现这一点?我也想以某种方式记录所有的错误。任何经验或建议将不胜感激

使用ajax调用递归列表,将列表分成100个部分(或任何设置)

var multiple=[{“Author”:“Sample Text”},{“Author”:“Second Sample Text”}];
(函数recursePost(set、iter、take){
var组=iter+take
创建一个方法,使用数组上的
slice
方法调用该方法以发送所需大小的批,手动调用一次,然后让ajax return在有更多记录时再次调用:

// obviously don't use globals in *your* code...
var current_count = 0;
var batch_size = 100;
var multiple = [{ "Author": "Sample Text" }, { "Author": "Second Sample Text" }... ];
var end_index = multiple.length() - 1;

function send_batch() {
   var batch_end = (current_count + batch_size) < end_index ? current_count + batch_size : end_index;
   var batch = multiple.slice(current_count, batch_end);
   current_count = batch_end;
   $.ajax({
     type: "POST",
     url: 'http://api.cloudservice.com/v1/your-api-key-here/Books',
     headers: { "Authorization": "Bearer your-access-token-here" },
     contentType: "application/json",
     data: JSON.stringify(batch),
     success: function (data) {
        if (batch_end <= end_index) {
           send_batch();
        }
     },
     error: function (error) {...}
    });
};
//显然不要在*您的*代码中使用globals。。。
无功电流_计数=0;
变量批次大小=100;
var multiple=[{“Author”:“Sample Text”},{“Author”:“Second Sample Text”}…];
var end_index=multiple.length()-1;
函数send_batch(){
var batch\u end=(当前\u计数+批次大小)如果(batch_end没有机会测试这一点,但是你明白了。批处理,有点像,但是使用异步而不是同步,所以你不必等待回调。你也可以在递归中这样做,但是在JS中递归总是比标准for循环消耗更多的能量

var x=null, tempArr=[], batch_size = 100,
    multiple = [{ "Author": "Sample Text" }, { "Author": "Second Sample Text" }... ];

for(x in multiple){
  tempArr = (multiple.length > 100) ? multiple.slice(0,99):  multiple.slice(0,multiple.length-1);
  multiple = multiple.slice(100, multiple.length-1);
  if (multiple.hasOwnProperty(x){
    $.ajax({
     type: "POST",
     url: 'http://api.cloudservice.com/v1/your-api-key-here/Books',
     headers: { "Authorization": "Bearer your-access-token-here" },
     contentType: "application/json",
     data: JSON.stringify(tempArr)
    })
    .done(function (data) {
      //process data returned
    });
  }
}

如果要同时进行ajax调用,可以执行以下操作:

var BATCH_SIZE = 100,
    calls = [];
for (var i = 0; i < multiple.length; i += BATCH_SIZE) {
    var batch = multiple.slice(i, i + BATCH_SIZE);
    calls.push($.ajax({
        type: 'post',
        url: 'http://api.cloudservice.com/v1/your-api-key-here/Books',
        headers: { "Authorization": "Bearer your-access-token-here" },
        contentType: "application/json",
        data: JSON.stringify(batch)
    }));
}
$.when.apply($, calls).done(function () {
    alert('last call finished');
});
var批次大小=100,
调用=[];
对于(变量i=0;i

为什么不想发送100k条记录的有效负载?有些字段包含整个页面内容,因此100k条记录的大小最终会达到数百MB。超时是我主要关心的问题。看看Javascript承诺。Q.js是一个很好的实现,但也有其他实现。您可以使用数组#切片来打破它对于任意大小的块,为每个块执行$.ajax。您不必担心限制并发请求,因为您的浏览器将限制对同一端点的并发请求。对于这样的大问题,我喜欢使用localStorage保存进度,以便可以从浏览器选项卡崩溃中恢复。我不存储本地数据,只是计数器/位置信息……你认为使用AJAX的“完整”回调会更好吗?也可能承诺会使这更优雅/可靠?@TruMan1-我很难说,因为我无法真正模拟那么多数据。如果你觉得其中一种设计更适合,那么这也会起作用:)我只是想概括一下方法。
var BATCH_SIZE = 100,
    calls = [];
for (var i = 0; i < multiple.length; i += BATCH_SIZE) {
    var batch = multiple.slice(i, i + BATCH_SIZE);
    calls.push($.ajax({
        type: 'post',
        url: 'http://api.cloudservice.com/v1/your-api-key-here/Books',
        headers: { "Authorization": "Bearer your-access-token-here" },
        contentType: "application/json",
        data: JSON.stringify(batch)
    }));
}
$.when.apply($, calls).done(function () {
    alert('last call finished');
});