Estoy agregando JavaScript a un SharePoint y estoy tratando de escribir una función que obtenga un documento de Excel, o más bien los datos que contiene, de una biblioteca. Ya he descubierto cómo hacerlo, pero los archivos en cuestión son demasiado grandes para ser devueltos. He considerado establecer manualmente el límite de tamaño para ajax, pero no he encontrado ninguna forma de hacerlo, por lo que el Plan B es enviar una consulta para cada fila
$("#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);
});
}
Como puede ver, estoy tratando de solucionar el problema asincrónico llamando a la función de forma recursiva cuando la solicitud vuelve con datos, lo que significa que tiene que seguir ejecutándose. Cuando coloco un console.log () justo antes del regreso, puedo ver que está compilando los resultados como lo necesito. Sin embargo, el retorno de llamar a readFileRow () regresa antes de que finalice el proceso y consiste en la respuesta de la primera consulta ajax, que aparentemente no se ejecutó a través de la función .done (). Intenté eliminar el retorno frente a la llamada ajax, pero esto solo causa una excepción, ya que el retorno ya no es posible y, por lo tanto, no tiene una función .done ().
¿Alguien puede detectar lo que está mal con esta función? Las funciones asíncronas no son mi fuerte y estoy bastante perplejo.
fuente