He visto muchos consejos sobre cómo usar las devoluciones de llamada y esperar con respecto a hacer que mi llamada ajax asíncrona sea síncrona, pero no tengo éxito. tengo un giro. La función que hace la llamada ajax es en sí misma asíncrona. A continuación se muestra mi intento de usar una devolución de llamada. No hay errores, pero no se escribe nada en la consola en el bucle for/. El propósito de esta funcionalidad es solicitar al usuario que seleccione uno o más archivos, importarlos a SSRS y actualizar un control de árbol con nuevos nodos que representen los nuevos archivos. La importación funciona y los datos devueltos por la llamada ajax (la nueva identificación del nodo) son válidos, pero se pierden cuando intento usarlos. Cualquier ayuda será apreciada.
async function readText(event, multiple, data) { var fileinfo = new Object(); fileinfo.Name = event.name; fileinfo.Path = '/' + fullpath; fileinfo.Replace = !multiple; fileinfo.Id = selectedId; array = new Uint8Array(await event.arrayBuffer()); fileinfo.Content = btoa( new Uint8Array(array) .reduce((data, byte) => data + String.fromCharCode(byte), '') ); $.ajax( { url: '/ABIReportsSSRS/ImportToSSRS', type: 'POST', data: fileinfo, success: function (data) { return data; }, error: function (request, status, error) { displayErrorMessage(request); } }); } function importData(multiple) { input = document.createElement('input'); input.type = 'file'; input.multiple = multiple; var treeviewObj = document.getElementById('tree').ej2_instances[0]; input.onchange = _ => { var newNode = []; for (var i = 0; i < event.target.files.length; i++) { readText(event.target.files.item(i), multiple, function (data) { console.log(data); newNode[i] = { Id: data, Name: event.target.files.item(i).name, Type: 'Resource', Image: '../../images/FA-file.png' } }); } if (multiple) { treeviewObj.addNodes(newNode, selectedId, null); } else { treeviewObj.updateNode(selectedId, event.target.files.item(i).name) } }; input.click(); }