繁体   English   中英

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

[英]How to send thousands of objects via AJAX?

我正在尝试使用其AJAX API将10万多个记录加载到云服务中。 看起来像这样:

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) {...}
})

我当然不希望发送10万条记录的有效负载,因此我可以一次将其减少到一百个。 即使这样,循环执行此操作仍然很大。 我将如何创建可靠的AJAX循环来执行此操作或其他方法? 我也想以某种方式可靠地记录所有错误。 任何经验或建议,将不胜感激!

使用ajax调用递归您的列表,将其分为100个部分(或您设置的任意部分)。

var multiple = [{ "Author": "Sample Text" }, { "Author": "Second Sample Text" }];
(function recursePost(set, iter, take){
 var group = iter + take < set.length ? iter + take: set.length - iter;
 var dataObj = [];
 for( var i = iter; i < group; i++ ){
  dataObj.push(set[i]);
 }
 iter += group;
 $.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(dataObj),
  success: function (data) {
    recursePost(set, iter, take);
  },
  error: function (error) {
    alert("Post Failed at " + (iter-group) + "-" + group);
  }
 });
})(multiple,0,100)

使用数组上的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) {...}
    });
};

您可以拉出Ajax调用并对其进行参数化以使其更通用,但希望您能理解。

还没有机会进行测试,但是您知道了。 批处理,某种程度上,但是使用异步而不是同步,因此您不必等待回调。 您也可以在递归中执行此操作,但是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');
});

的jsfiddle

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM