Ich füge einem SharePoint JavaScript hinzu und versuche, eine Funktion zu schreiben, die ein Excel-Dokument oder vielmehr die darin enthaltenen Daten aus einer Bibliothek abruft. Ich habe bereits herausgefunden, wie das geht, aber die fraglichen Dateien sind zu groß, um zurückgegeben zu werden. Ich habe überlegt, die Größenbeschränkung für Ajax manuell festzulegen, aber ich habe keine Möglichkeit gefunden, dies zu tun. Daher besteht Plan B darin, für jede Zeile eine Abfrage zu senden
$("#button").click(function() {
readFileRow(libraryUrl, "FileName.xlsx", "Sheet1", 1, "E", [])
.done(function(cells) {
console.log(xmlToJson(cells.documentElement));
});
});
/**
* Reads a file in SharePoint Library via ExcelRest and returns the document
*
* @params string libraryUrl
* @params string fileName
* @params string sheetName
* @params int rowNum
* @params string lastColumn
* @params string[][] finalResults
*
* @returns string[][]
**/
function readFileRow(libraryUrl, fileName, sheetName, rowNum, lastColumn, finalResults) {
var fileUrl = libraryUrl + "/" + fileName + "/Model/Ranges('" + sheetName + "!A" + rowNum + "|" + lastColumn + rowNum + "')?$format=atom";
return $.ajax({
url: fileUrl,
type: "GET",
error: function (request, status, error) {
console.log(error);
},
}).done(function(data) {
jsonData = xmlToJson(data.documentElement);
cells = serializeRange(jsonData);
if(cells) {
finalResults.push(cells);
rowNum++;
finalResults = readFileRow(libraryUrl, fileName, sheetName, rowNum, lastColumn, finalResults);
}
return $.when(finalResults);
});
}
Wie Sie sehen, versuche ich, das asynchrone Problem zu umgehen, indem ich die Funktion rekursiv aufrufe, wenn die Anforderung mit Daten zurückkommt, was bedeutet, dass sie weiter ausgeführt werden muss. Wenn ich eine console.log () kurz vor der Rückgabe platziere, kann ich sehen, dass die Ergebnisse so kompiliert werden, wie ich es brauche. Die Rückkehr vom Aufruf von readFileRow () erfolgt jedoch vor Abschluss des Prozesses und besteht aus der Antwort der allerersten Ajax-Abfrage, die anscheinend nicht über die Funktion .done () ausgeführt wurde. Ich habe versucht, die Rückgabe vor dem Ajax-Aufruf zu entfernen, dies führt jedoch nur zu einer Ausnahme, da die Rückgabe nicht mehr möglich ist und daher keine .done () -Funktion hat.
Kann jemand erkennen, was mit dieser Funktion nicht stimmt? Async-Funktionen sind nicht meine Stärke und ich bin ziemlich ratlos.
quelle