Javascript 如何通过AJAX发送数千个对象?
我正在尝试使用AJAXAPI将100K+记录加载到云服务中。它看起来像这样: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"
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');
});