É o começo de um novo ano e, embora muitas pessoas prometam ser mais ativas, vou mostrar a você como fazer s para ser mais preguiçoso… , isto é. Promise JavaScript Promise Fará mais sentido daqui a pouco. https://www.youtube.com/watch?v=qj7diPVWTqY?embedable=true Primeiro, vamos ver um exemplo básico de . Aqui, tenho uma função chamada sleep que leva um tempo em milissegundos e um valor. Ele retorna uma promessa que executará um pelo número de milissegundos que devemos esperar; então a promessa resolve com o 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 assim: Podemos aguardar a função com os argumentos e e, após um segundo, o registrará a string 'Yawn & stretch'. sleep 1000 'Yawn & stretch' console Não há nada de muito especial nisso. Ele provavelmente se comporta como você esperaria, mas fica um pouco estranho se o armazenarmos como uma variável para mais tarde, em vez de o retornado imediatamente. await await Promise const nap = sleep(1000, 'Yawn & stretch') Agora, digamos que fazemos algum outro trabalho que leva tempo (como digitar o próximo exemplo) e, em seguida, a variável . await nap Você pode esperar um atraso de um segundo antes de resolver, mas, na verdade, ele resolve imediatamente. Sempre que você cria um , você instancia qualquer funcionalidade assíncrona pela qual ele é responsável. Promise Em nosso exemplo, no momento em que definimos a variável , é criada a que executa o . Como sou um digitador lento, a será resolvida no momento em que a . nap Promise setTimeout Promise await Em outras palavras, s estão ansiosos. Eles não que você os espere. Promise await Em alguns casos, isso é bom. Em outros casos, pode levar ao uso desnecessário de recursos. Para esses cenários, você pode querer algo que se pareça com um , mas use para instanciar apenas quando você precisar. Promise avaliação preguiçosa Antes de continuarmos, quero mostrar-lhe algo interessante. As não são as únicas coisas que podem ser em JavaScript. Se criarmos um simples com um método , podemos esse objeto como qualquer . Promise await Object .then() await Promise Isso é meio estranho, mas também nos permite criar diferentes objetos que com s, mas não são. Esses objetos às vezes são chamados de “ “. se parecem Promise Thenables Com isso em mente, vamos criar um novo chamado que estende o construtor interno de . Estender Promise não é estritamente necessário, mas faz com que pareça mais semelhante a uma usando coisas como . classe 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); } } A parte a ser focada é o método . Ele sequestra o comportamento padrão de um padrão para esperar até que o método seja executado antes de criar um real. then() Promise .then() Promise Isso evita instanciar a funcionalidade assíncrona até que você realmente a chame. E funciona se você chamar explicitamente ou usar . .then() await Agora, vamos ver o que acontece se substituirmos o na função original por um . Mais uma vez, atribuiremos o resultado a uma variável . Promise sleep LazyPromise nap function sleep(ms, value) { return new LazyPromise((resolve) => { setTimeout(() => resolve(value), ms); }); } const nap = sleep(1000, 'Yawn & stretch') Em seguida, tomamos nosso tempo para digitar a linha e executá-la. await nap Desta vez, vemos um atraso de um segundo antes que a seja resolvida, independentemente de quanto tempo passou desde que a variável foi criada. Promise (Observe que esta implementação apenas cria o novo uma vez e faz referência a ele em chamadas subsequentes. Portanto, se novamente, ele será resolvido imediatamente como qualquer normal ) Promise await Promise Claro, este é um exemplo trivial que você provavelmente não encontrará no código de produção, mas há muitos projetos que usam objetos do tipo avaliados preguiçosamente. Provavelmente, o exemplo mais comum é com bancos de dados s e construtores de consulta como ou . Promise ORM Knex.js Prisma Considere o pseudo-código abaixo. É inspirado por alguns destes construtores de consulta: const query = db('user') .select('name') .limit(10) const users = await query Criamos uma consulta de banco de dados que vai até a tabela e seleciona as dez primeiras entradas e retorna seus nomes. Em teoria, isso funcionaria bem com um regular. "user" Promise Mas e se quiséssemos modificar a consulta com base em certas condições, como parâmetros de string de consulta? Seria bom poder continuar modificando a consulta antes de finalmente aguardar o . 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 Se a consulta de banco de dados original fosse uma padrão, ela instanciaria prontamente a consulta assim que atribuíssemos a variável e não poderíamos modificá-la posteriormente. Promise Com a avaliação preguiçosa, podemos escrever um código como este que é mais fácil de seguir, melhora a experiência do desenvolvedor e só executa a consulta uma vez quando precisamos dela. Esse é um exemplo em que a avaliação preguiçosa é ótima. Também pode ser útil para coisas como construir, modificar e orquestrar solicitações HTTP. Lazy s são muito legais para os casos de uso certos, mas isso não quer dizer que devam substituir todos os . Em alguns casos, é bom instanciar rapidamente e ter a resposta pronta o mais rápido possível. Promise Promise Este é outro daqueles cenários “depende”. Mas da próxima vez que alguém lhe pedir para fazer uma , considere ser preguiçoso ( ͡° ͜ʖ ͡°). Promise Muito obrigado pela leitura. Se você gostou deste artigo, por favor . É uma das melhores formas de me apoiar. Você também pode ou se você quiser saber quando novos artigos são publicados. Compartilhe assine minha newsletter Siga me no twitter Originalmente publicado em austingil.com .