Es el comienzo de un nuevo año, y aunque muchas personas prometen ser más activas, les mostraré cómo hacer para ser más vagos... s, eso es. Promise JavaScript Promise Tendrá más sentido en un momento. https://www.youtube.com/watch?v=qj7diPVWTqY?embedable=true Primero, veamos un ejemplo básico de . Aquí tengo una función llamada dormir que toma un tiempo en milisegundos y un valor. Devuelve una promesa que ejecutará un por la cantidad de milisegundos que debemos esperar; entonces la Promesa se resuelve con el valor. Promise setTimeout /** * @template ValueType * @param {number} ms * @param {ValueType} value * @returns {Promise<ValueType>} */ function sleep(ms, value) { return new Promise((resolve) => { setTimeout(() => resolve(value), ms); }); } Funciona así: Podemos esperar la función de con los argumentos y , y después de un segundo, la registrará la cadena, 'Bostezo y estiramiento'. sleep 1000 'Yawn & stretch' console No hay nada demasiado especial en eso. Probablemente se comporte como cabría esperar, pero se vuelve un poco extraño si lo almacenamos como una variable para más adelante, en lugar de la devuelta de inmediato. await await Promise const nap = sleep(1000, 'Yawn & stretch') Ahora, digamos que hacemos otro trabajo que toma tiempo (como escribir el siguiente ejemplo), y luego la variable . await nap Es posible que espere un retraso de un segundo antes de resolverse, pero de hecho, se resuelve de inmediato. Cada vez que crea una , crea una instancia de cualquier funcionalidad asíncrona de la que sea responsable. Promise En nuestro ejemplo, en el momento en que definimos la variable , se crea que ejecuta . Como soy un tipeador lento, la se resolverá cuando la . nap Promise setTimeout Promise await En otras palabras, los están ansiosos. Ellos no a que tú los esperes. Promise await En algunos casos, esto es algo bueno. En otros casos, podría conducir a un uso innecesario de recursos. Para esos escenarios, es posible que desee algo que se parezca a una , pero use para instanciar solo cuando lo necesite. Promise evaluación perezosa Antes de continuar, quiero mostrarles algo interesante. Las no son las únicas cosas que se pueden en JavaScript. Si creamos un simple con un método , podemos ese objeto como cualquier . Promise await Object .then() await Promise Esto es un poco extraño, pero también nos permite crear diferentes objetos que se a , pero no lo son. Estos objetos a veces se denominan “ “. parecen Promise entoncesables Con eso en mente, vamos a crear un nuevo llamado que extiende el constructor integrado. Extender Promise no es estrictamente necesario, pero lo hace parecer más similar a usando cosas como . clase LazyPromise Promise Promise instanceof class LazyPromise extends Promise { /** @param {ConstructorParameters<PromiseConstructor>[0]} executor */ constructor(executor) { super(executor); if (typeof executor !== 'function') { throw new TypeError(`LazyPromise executor is not a function`); } this._executor = executor; } then() { this.promise = this.promise || new Promise(this._executor); return this.promise.then.apply(this.promise, arguments); } } La parte en la que hay que centrarse es el método . Se secuestra el comportamiento predeterminado de una estándar para esperar hasta que se ejecute el método antes de crear una real. then() Promise .then() Promise Esto evita instanciar la funcionalidad asincrónica hasta que realmente la solicite. Y funciona tanto si llamas explícitamente a como si usas . .then() await Ahora, veamos qué sucede si reemplazamos en la función de original con . Una vez más, asignaremos el resultado a una variable de . Promise sleep LazyPromise nap function sleep(ms, value) { return new LazyPromise((resolve) => { setTimeout(() => resolve(value), ms); }); } const nap = sleep(1000, 'Yawn & stretch') Luego nos tomamos nuestro tiempo para escribir la línea y ejecutarla. await nap Esta vez, vemos un retraso de un segundo antes de que se resuelva la , independientemente del tiempo transcurrido desde que se creó la variable. Promise (Tenga en cuenta que esta implementación solo crea la nueva una vez y hace referencia a ella en llamadas posteriores. Por lo tanto, si tuviéramos que nuevamente, se resolvería inmediatamente como cualquier normal). Promise await Promise Por supuesto, este es un ejemplo trivial que probablemente no encontrará en el código de producción, pero hay muchos proyectos que usan objetos tipo con evaluación perezosa. Probablemente el ejemplo más común es con de base de datos y generadores de consultas como o . Promise ORM Knex.js prisma Considere el pseudocódigo a continuación. Está inspirado en algunos de estos generadores de consultas: const query = db('user') .select('name') .limit(10) const users = await query Creamos una consulta de base de datos que va a la tabla y selecciona las primeras diez entradas y devuelve sus nombres. En teoría, esto funcionaría bien con una normal. "user" Promise Pero, ¿y si quisiéramos modificar la consulta en función de ciertas condiciones, como los parámetros de la cadena de consulta? Sería bueno poder continuar modificando la consulta antes de esperar finalmente la . Promise const query = db('user') .select('name') .limit(10) if (orderBy) { query.orderBy(orderBy) } if (limit) { query.limit(limit) } if (id) { query.where({ id: id }) } const users = await query Si la consulta original de la base de datos fuera una estándar, instanciaría con entusiasmo la consulta tan pronto como asignáramos la variable, y no podríamos modificarla más adelante. Promise Con la evaluación perezosa, podemos escribir código como este que es más fácil de seguir, mejora la experiencia del desarrollador y solo ejecuta la consulta una vez cuando la necesitamos. Ese es un ejemplo donde la evaluación perezosa es genial. También podría ser útil para cosas como crear, modificar y orquestar solicitudes HTTP. Lazy s son geniales para los casos de uso correctos, pero eso no quiere decir que deban reemplazar cada . En algunos casos, es beneficioso instanciar con entusiasmo y tener la respuesta lista lo antes posible. Promise Promise Este es otro de esos escenarios de "depende". Pero la próxima vez que alguien te pida que hagas una , considera ser perezoso al respecto ( ͡° ͜ʖ ͡°). Promise Muchas Gracias Por Leer. Si te ha gustado este artículo, por favor . Es una de las mejores formas de apoyarme. Tú también puedes o si quieres saber cuando se publican nuevos artículos. Compártelo Inscríbete a mi boletín de noticias Sigueme en Twitter Publicado originalmente en austingil.com .