Estou adicionando JavaScript a um SharePoint e estou tentando escrever uma função que obtém um documento do Excel, ou melhor, os dados nele, de uma biblioteca. Eu já descobri como fazer isso, mas os arquivos em questão são muito grandes para serem retornados. Eu considerei definir manualmente o limite de tamanho para o ajax, mas não encontrei nenhuma maneira de fazer isso, portanto, o Plano B é enviar uma consulta para cada linha
$("#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 você pode ver, estou tentando contornar o problema assíncrono chamando a função recursivamente quando a solicitação retorna com dados, o que significa que ela deve continuar em execução. Quando coloco um console.log () imediatamente antes do retorno, percebo que ele está compilando os resultados conforme necessário. No entanto, o retorno da chamada readFileRow () volta antes do término do processo e consiste na resposta da primeira consulta ajax, aparentemente não tendo sido executada através da função .done (). Tentei remover o retorno na frente da chamada ajax, mas isso só causa uma exceção, pois o retorno não é mais selecionável e, portanto, não possui uma função .done ().
Alguém pode identificar o que há de errado com essa função? As funções assíncronas não são o meu forte e estou bastante perplexo.
fonte