Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

531
Visualizações
Constructor de clase Async/Await

Por el momento, estoy intentando usar async/await dentro de una función de constructor de clase. Esto es para que pueda obtener una etiqueta e-mail personalizada para un proyecto de Electron en el que estoy trabajando.

 customElements.define('e-mail', class extends HTMLElement { async constructor() { super() let uid = this.getAttribute('data-uid') let message = await grabUID(uid) const shadowRoot = this.attachShadow({mode: 'open'}) shadowRoot.innerHTML = ` <div id="email">A random email message has appeared. ${message}</div> ` } })

Por el momento sin embargo, el proyecto no funciona, con el siguiente error:

 Class constructor may not be an async method

¿Hay alguna manera de eludir esto para que pueda usar async/await dentro de esto? En lugar de requerir devoluciones de llamada o .then()?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Definitivamente puede hacer esto, devolviendo una expresión de función asíncrona invocada inmediatamente desde el constructor. IIAFE es el nombre elegante de un patrón muy común que se requería para usar await fuera de una función asíncrona, antes de que la espera de nivel superior estuviera disponible:

 (async () => { await someFunction(); })();

Usaremos este patrón para ejecutar inmediatamente la función asíncrona en el constructor y devolver su resultado como this :

 // Sample async function to be used in the async constructor async function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } class AsyncConstructor { constructor(value) { return (async () => { // Call async functions here await sleep(500); this.value = value; // Constructors return `this` implicitly, but this is an IIFE, so // return `this` explicitly (else we'd return an empty object). return this; })(); } } (async () => { console.log('Constructing...'); const obj = await new AsyncConstructor(123); console.log('Done:', obj); })();

Para instanciar la clase, use:

 const instance = await new AsyncConstructor(...);

Para TypeScript, debe afirmar que el tipo del constructor es el tipo de clase, en lugar de una promesa que devuelve el tipo de clase:

 class AsyncConstructor { constructor(value) { return (async (): Promise<AsyncConstructor> => { // ... return this; })() as unknown as AsyncConstructor; // <-- type assertion } }

Desventajas

  1. Extender una clase con un constructor asíncrono tendrá una limitación. Si necesita llamar a super en el constructor de la clase derivada, tendrá que llamarlo sin await . Si necesita llamar al superconstructor con await , se encontrará con el error 2337 de TypeScript: las superllamadas Super calls are not permitted outside constructors or in nested functions inside constructors.
  2. Se ha argumentado que es una "mala práctica" que una función constructora devuelva una Promesa .

Antes de usar esta solución, determine si necesitará extender la clase y documente que se debe llamar al constructor con await .

over 4 years ago · Santiago Trujillo Relatório

0

Debido a que las funciones asíncronas son promesas, puede crear una función estática en su clase que ejecute una función asíncrona que devuelva la instancia de la clase:

 class Yql { constructor () { // Set up your class } static init () { return (async function () { let yql = new Yql() // Do async stuff await yql.build() // Return instance return yql }()) } async build () { // Do stuff with await if needed } } async function yql () { // Do this instead of "new Yql()" let yql = await Yql.init() // Do stuff with yql instance } yql()

Llame con let yql = await Yql.init() desde una función asíncrona.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda