Estoy usando OfficeJS en un complemento de Word y veo un comportamiento extraño con respecto a un error que aparece en la consola con el registro "Error de tamaño de pila de llamadas de rango máximo".
El siguiente código funciona para casi todos los documentos. Pero para documentos específicos, parece que file.getSliceAsync falla y provoca el error. Sin embargo, al realizar pruebas, algunos de nuestros desarrolladores pueden reproducir el error y otros no. Funciona el 100% del tiempo o el 0% del tiempo para un solo desarrollador.
Hemos intentado borrar cachés, pero sin éxito. No hay nada que sobresalga en los documentos que fallan aquí.
Parece que se trata de un error en la biblioteca de OfficeJS, pero no estoy seguro de que haya alguna solución.
¿Algunas ideas?
Código a continuación:
static async getFileContent(): Promise<number[]> { console.log('Starting file content retrieval'); return new Promise((resolve, reject) => { return Office.context.document.getFileAsync( Office.FileType.Compressed, async (result) => { if (result.status === Office.AsyncResultStatus.Succeeded) { const file: Office.File = result.value; console.log('Slice count: ' + file.sliceCount); // Get all file slices const fileSlicePromises: Promise<number[]>[] = [ ...Array(file.sliceCount).keys(), ].map((counter) => WordDocumentService.getFileSlice(file, counter)); console.log('fileSlices length: ' + fileSlicePromises.length); // Combine file slices into a single file and then close the file const dataSlices: number[][] = await Promise.all(fileSlicePromises).finally( () => WordDocumentService.closeOfficeFile(file) ); console.log('Concatenating data'); return resolve([].concat(...dataSlices)); } else { return reject(`Failed to get file content: ${result?.error?.message}`); } } ); }); } static getFileSlice(file: Office.File, sliceIndex: number): Promise<number[]> { console.log('Getting file slice: ' + sliceIndex); return new Promise((resolve, reject) => { return file.getSliceAsync(sliceIndex, (result) => { if (result.status === Office.AsyncResultStatus.Succeeded) { return resolve(result.value.data); } else { return reject( `Failed to get file slice ${sliceIndex} from file: ${result?.error?.message}` ); } }); }); } static closeOfficeFile(file: Office.File): Promise<void> { console.log('Closing office file'); return new Promise((resolve, reject) => { return file.closeAsync((result) => { if (result.status === Office.AsyncResultStatus.Succeeded) { return resolve(); } else { return reject(`Failed to close file: ${result?.error?.message}`); } }); }); }