es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Ejecutar código dentro de setTimeout en una función asincrónica?

Un script simple, lo que estoy tratando de lograr es agregar un nuevo elemento en el método append, y usar funciones asíncronas.

Estoy tratando de entender cómo funcionan los métodos then y catch en lugar de usarlos sin entender cómo funcionan internamente (usando axios o algo similar).

El push debe ejecutarse después de 3 segundos.

Intenté usar el método resolve dentro de setTimeout, pero estoy obteniendo un error porque resolve no es reconocido, estoy retornando una Promesa porque no puedo hacer un await a setTimeout.

<script>

    async function test(terms) {
        let termss = await append(terms);
        return [termss[termss.length - 2], termss[termss.length - 1]]
    }

    async function append(arr) {
        var arrr = arr;

        const waitFor = () => new Promise(resolve => {
            setTimeout(() => {
                arrr.push("Taoufiq")
                arrr.push("comprende");
            }, 3000)
        });

        await waitFor();

        return arrr;
    }

    test([1, 2, 3, 9]).then((result) => {
        console.log(result)
    })

</script>

¡Ayuda en esto para entender cómo funciona!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    En el script proporcionado, se define una función asíncrona llamada test que recibe un array como parámetro, y luego llama a otra función asíncrona llamada append pasando el mismo array como argumento.

    Dentro de la función, se crea una nueva Promise que se resuelve después de 3 segundos utilizando una función timeout. La Promise luego actualiza el array añadiendo dos nuevas cadenas “Taoufiq” y “understands”.

    La palabra clave await se utiliza para esperar a que la promise se resuelva y devuelva el array actualizado arrr desde la función append.

    Luego, la función test devuelve un nuevo array con los dos últimos elementos del array añadido utilizando el método Array.slice.

    Por último, se llama a la función test pasando un array [1,2,3,9] como argumento y luego se resuelve la promise devuelta utilizando el método .then que recibe una función de devolución de llamada como parámetro que muestra el array devuelto en la consola.

    Para hacer que funcione, debemos eliminar el parámetro resolve de la función setTimeout y llamar directamente a la función resolve después de 3 segundos de tiempo de espera.

    El código actualizado sería:

    <script>
    
        async function test(terms) {
            let termss = await append(terms);
            return [termss[termss.length - 2], termss[termss.length - 1]];
        }
    
        async function append(arr) {
            var arrr = arr;
    
            const waitFor = () => new Promise((resolve) => {
                setTimeout(() => {
                    arrr.push("Taoufiq")
                    arrr.push("understands");
                    resolve(); // Resolviendo la promesa aquí
                }, 3000)
            });
    
            await waitFor();
    
            return arrr;
        }
    
        test([1, 2, 3, 9]).then((result) => {
            console.log(result) // Salida: ["Taoufiq", "understands"]
        })
    
    </script>
    

Comments are closed.