invocación asíncrona dentro de los constructores: un esfuerzo imposible
La programación asíncrona usando async/aux Considere el siguiente fragmento 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 = `Desafortunadamente, este código falla con el mensaje de error:
El constructor de clases puede no ser un método asyncLa razón de esto es fundamental: una función de constructor es responsable de inicializar y devolver una instancia de objeto. Sin embargo, la palabra clave Async convierte una función en un generador de promesa, lo que resulta en que la función devuelva una promesa en lugar del objeto en sí. Esto crea un conflicto inherente.
revelando la imposibilidad
La idea errónea surge de la similitud percibida entre async/esperanza y promesas. Si bien Async/Agait proporciona azúcar sintáctica para trabajar con promesas, no altera el comportamiento subyacente. Las promesas representan operaciones asincrónicas que se resuelven o rechazan para producir un valor.
, en contraste, una función de constructor debe devolver el objeto que se está construyendo. Este requisito inmutable no se puede reconciliar con el comportamiento que produce la promesa de una función async.
strategies spoilound
para superar esta limitación, considere emplear uno de los siguientes patrones de diseño:
[&] [&]Función de inicialización () [) [) [) realizar tareas asincrónicas. La instancia del objeto solo se puede usar dentro de esta función.
- var myobj = new myclass (); myobj.init (function () { // por aquí puedes usar myobj });
var myObj = new myClass(); myObj.init(function() { // inside here you can use myObj });Patrón de construcción: en lugar de llamar al constructor directamente, use una función de constructor para crear una instancia de objeto. La función del constructor devuelve una promesa que se resuelve a la instancia del objeto una vez que todas las tareas asincrónicas están completas.
, tenga en cuenta que mientras los ejemplos anteriores usan promesas en el patrón de constructor, también se pueden usar devoluciones de call.- myclass.build (). Entonces (function (myobj) { // myobj es devuelto por la promesa, no por el constructor o constructor }); // con async/espera: function async foo () { var myobj = espera myclass.build (); }
var myObj = new myClass(); myObj.init(function() { // inside here you can use myObj });consideraciones de función estática
Es importante tener en cuenta que esta clave dentro de las funciones estatales no se refiere al objeto Instantado sino a la clase en sí. Por lo tanto, no puede llamar a los métodos directamente dentro de las funciones estáticas. En su lugar, consulte los métodos utilizando el nombre de la clase o declararlos como métodos estáticos.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3