invocação assíncrona dentro de construtores: um erevor impossível
programação assíncrona usando async/aguarda tornou -se comum, mas sua aplicação em uma função construtora aumenta um desafio intrigante. Considere o seguinte snippet de código:
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 = `Infelizmente, este código falha com a mensagem de erro:
o construtor de classe pode não ser um método assíncronoo motivo disso é fundamental: uma função do construtor é responsável por inicializar e retornar uma instância do objeto. No entanto, a palavra -chave assíncrona converte uma função em um gerador de promessas, resultando na função retornando uma promessa em vez do próprio objeto. Isso cria um conflito inerente. Embora o Async/Await forneça açúcar sintático para trabalhar com promessas, ele não altera o comportamento subjacente. As promessas representam operações assíncronas que resolvem ou rejeitam para produzir um valor. Esse requisito imutável não pode ser reconciliado com o comportamento produtor de promessa de uma função assíncrona. Função de inicialização para executar tarefas assíncronas. A instância do objeto só pode ser usada nessa função.
var myobj = new myclass (); myobj.init (function () { // dentro aqui você pode usar myobj });
Builder Pattern
: Em vez de chamar o construtor diretamente, use uma função do construtor para criar uma instância do objeto. A função do construtor retorna uma promessa que resolve à instância do objeto assim que todas as tarefas assíncronas estiverem concluídas. // myobj é devolvido pela promessa, não pelo construtor ou construtor }); // com assíncrono/aguardar: função assíncrona foo () { var myobj = aguarda myclass.build (); }
Observe que, embora os exemplos acima usam promessas no padrão do construtor, os retornos de chamada também podem ser usados. Portanto, você não pode chamar métodos diretamente nas funções estáticas. Em vez disso, consulte os métodos usando o nome da classe ou os declare como métodos estáticos.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3