2 Stimmen

Wie sende ich Tausende von Objekten über AJAX?

Ich versuche, mehr als 100.000 Datensätze in einen Cloud-Dienst mithilfe ihrer AJAX-API zu laden. Es sieht ungefähr so aus:

var multiple = [{ "Author": "Beispielsatz" }, { "Author": "Zweiter Beispielsatz" },...];

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

Ich möchte natürlich keine Nutzlast von 100.000 Datensätzen senden, daher kann ich sie zum Beispiel auf hundert reduzieren. Selbst dann wäre dies in einer Schleife noch groß. Wie könnte ich eine zuverlässige AJAX-Schleife erstellen, um dies zu tun, oder vielleicht auf eine andere Weise? Ich möchte auch alle Fehler irgendwie zuverlässig protokollieren. Jegliche Erfahrungen oder Vorschläge wären sehr willkommen!

0voto

Travis J Punkte 78877

Rekurrieren Sie Ihre Liste mit den Ajax-Aufrufen, indem Sie sie in Abschnitte von 100 (oder was auch immer Sie nehmen) aufteilen.

var multiple = [{ "Autor": "Beispieltext" }, { "Autor": "Zweiter Beispieltext" }];
(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)

0voto

veddermatic Punkte 1062

Erstellen Sie eine Methode, die aufgerufen wird, um eine Charge beliebiger Größe mit der slice-Methode des Arrays zu senden, rufen Sie sie manuell einmal auf und rufen Sie sie dann erneut auf, wenn weitere Datensätze zurückgegeben werden:

// Verwenden Sie natürlich keine globalen Variablen in *Ihrem* Code...
var current_count = 0;
var batch_size = 100;
var multiple = [{ "Autor": "Beispieltext" }, { "Autor": "Zweiter Beispieltext" }... ];
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) {...}
    });
};

Sie können den Ajax-Aufruf extrahieren und Parameter verwenden, um die Dinge allgemeiner zu gestalten, aber hoffentlich verstehen Sie das Konzept.

0voto

Eric Hodonsky Punkte 4958

Ich habe noch keine Gelegenheit gehabt, dies zu testen, aber Sie verstehen die Idee. Stapelverarbeitung irgendwie, aber mit async anstelle von sync, sodass Sie nicht auf den Rückruf warten müssen. Sie könnten dies auch im rekursiven Modus machen, aber das Rekursieren in JS erfordert immer mehr Energie als eine Standard-For-Schleife.

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) {
      //Verarbeitung der zurückgegebenen Daten
    });
  }
}

0voto

John S Punkte 20732

Wenn Sie die Ajax-Aufrufe gleichzeitig ausführen möchten, könnten Sie folgendes tun:

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('letzter Aufruf beendet');
});

jsfiddle

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X