Tengo una función que contiene un ciclo que itera sobre una matriz de objetos. En cada iteración, necesito ejecutar una función asíncrona y recuperar un valor de la solicitud; sin embargo, necesito que cada iteración del bucle for haga una pausa y espere la respuesta antes de continuar.
Por ejemplo:
const tokeniseCustomer = async () => { const object [{"val1":1,"val2":2},{"val1":"a","val2":"b"}]; for (let index = 0; index < object.length; index += 1) { const data = await getData(object[index]); console.log(data); //wait for data before progressing to next loop iteration } };Pensé que al agregar la palabra clave "esperar" en el ejemplo anterior, el bucle esperaría a que la función getData devolviera un valor.
El problema con el código anterior es que no se registra nada en la consola. Intenté solucionar este problema agregando un registro adicional. Por ejemplo:
const tokeniseCustomer = async () => { const object [{"val1":1,"val2":2},{"val1":"a","val2":"b"}]; for (let index = 0; index < object.length; index += 1) { console.log('a') const data = await getData(object[index]); console.log('b'); console.log(data); //wait for data before progressing to next loop iteration } };El código anterior registra 'a' pero no 'b'.
Así es como se ve mi función getData:
const getData = async (object) => { //get the data from MSSQL and return it const result = await MSSQLFUNCTION(object); return result; };Realmente no estoy seguro de lo que estoy haciendo mal. ¿Me equivoco al usar for loops con await?
Await solo se puede usar dentro de una función asíncrona. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await#:~:text=It%20can%20only%20be%20used%20inside%C2%A0an%20async%20function
function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } const object = [ { val1: 1, val2: 2 }, { val1: "a", val2: "b" }, ]; (async () => { for (let index = 0; index < object.length; index += 1) { console.log("a"); const data = await sleep(5000) console.log("b"); console.log(data); } })();¿Puede probar el fragmento que se menciona a continuación? Esto básicamente ejecuta un reductor sobre la matriz y espera a que se complete la promesa anterior antes de ejecutar la siguiente.
const tokeniseCustomer = async () => { const object = [{"val1":1,"val2":2},{"val1":"a","val2":"b"}]; object.reduce(async (acc, curr) => { await acc; return getData(curr); }, Promise.resolve(null)) }