Saltar al contenido

Uso de Async/Await con las funciones del generador

La definición de una función generadora es una función que puede ser pausada y reanudada en un momento posterior, al tiempo que tiene la capacidad de pasar valores hacia y desde la función en cada punto de pausa.

Las funciones del generador pueden funcionar hasta el final, pero no tienen por qué hacerlo. Hasta ahora, en Javascript, una función siempre se ejecutaba hasta su finalización. Ahora podemos escribir funciones generadoras que nunca dejan de «correr». Lo pongo entre comillas porque no es como si una función generadora estuviera atascada en un bucle infinito. Es sólo que tal vez no necesitemos el resto de la función para ejecutarla.

Uso de Async/Await con las funciones del generador
Uso de Async/Await con las funciones del generador

La sintaxis de una función generadora no es tan diferente de una función normal. Necesitamos añadir un asterisco en algún lugar entre la palabra clave de la función y el nombre de la función. No es importante dónde pongas el asterisco. Sólo tiene que estar antes del nombre.

12345function*fetchData(){...}// orfunction*fetchData(){...}// orfunction*fetchData(){...}

js

Hay una pieza importante que realmente muestra el poder de un generador. Quieres ser capaz de pausar esta función. Para pausar la ejecución, necesitas la palabra clave de rendimiento.

123function*fetchData(){const data =yieldfetchMovies();}

js

Cuando ejecutas la función, devuelve un iterador que puedes controlar con el método next():

123456fetchMovies(){const data =yieldfetch();}const iter =fetchData();iter.next();// ejecutar la función generadora hasta la palabra clave `yield`.

js

Usar la palabra clave de rendimiento le dice a la función que se detenga y espere. Mientras está en pausa, no se ejecutará nada más hasta que pase otra llamada.

El método next() devuelve un objeto con dos propiedades, value y done. Value es el valor que se pasa a la función de rendimiento, y done es una booleana que te permite saber si el generador ha terminado de ejecutarse. Este objeto también se conoce como la interfaz IteratorResult (de la espec.).

Aquí hay un ejemplo más completo:

12345678910function*fetchUsers(){yieldfetch($0027https://jsonplaceholder.typicode.com/users$0027).then(resp= > resp.json()).then(users=;{return users;});}const usersIt =fetchUsers();usersIt.next().value.then(resp=>console.log(resp));

js