javascript asynchronous async-await

¿Cómo no olvidar el uso de waitit en todas partes en Javascript?



asynchronous async-await (1)

Intentando escribir una pequeña extensión de Chrome, que se basa en las funciones de consulta de la interfaz de chrome.* , Rápidamente llegué a las promesas y async / wait, ya que necesitaba garantizar el orden de ciertas operaciones, mientras trataba de evitar la devolución de llamada infierno

Sin embargo, una vez que introduje async / wait en algunas funciones, todas las funciones que las usaron también tuvieron que convertirse en una async function para poder await el valor de retorno. Finalmente, incluso algunas constantes globales se convirtieron en promesas, por ejemplo

const DEBUG = new Promise(function(resolve){ chrome.management.getSelf(resolve); }).then(function(self){ return self.installType == ''development''; });

Sin embargo, ahora necesito escribir en await todas partes e introducir errores extraños como if(DEBUG){...} siempre se ejecuta se vuelve demasiado fácil.

Si bien parece posible identificar los errores utilizando ESLINT , escribir en await todas partes parece innecesariamente engorroso y, por lo tanto, me preguntaba si Javascript tiene una construcción mejor que me estoy perdiendo.

(Subjetivamente, mi uso actual de wait / async parece inverso; las promesas se mantienen tal cual, a menos que se esperen explícitamente, pero me parece más deseable que las promesas se esperen por defecto en las funciones asincrónicas y se mantengan como promesas desnudas solo cuando se solicite explícitamente).


Por la falta de un sistema de tipos que permita detectar fácilmente tales errores (¿consideró Typecript o Flow?), Puede usar la notación húngara de sistemas para sus nombres de variables. Elija un prefijo de sufijo como P , Promise o $ y agréguelo a todas sus variables de promesa, de forma similar a cómo las funciones asíncronas a menudo se nombran con un sufijo asíncrono. Entonces solo haz cosas como

const debug = await debugPromise

donde puede ver rápidamente if (debug) está bien pero if (debugPromise) no.

Una vez que introduje async / await en algunas funciones, cada función que las usaba también tenía que convertirse en una función asincrónica para poder esperar el valor de retorno. Finalmente, incluso algunas constantes globales se convirtieron en promesas

Yo no haría eso. Intente hacer que la menor cantidad de funciones sea lo más asíncrona posible. Si no están haciendo cosas intrínsecamente asíncronas, sino que solo se basan en los resultados de algunas promesas, declare esos resultados como parámetros de la función. Un simple ejemplo:

// Bad async function fetchAndParse(options) { const response = await fetch(options); // do something return result; } // usage: await fetchAndParse(options)

// Good: function parse(response) { // do something return result; } // usage: await fetch(options).then(parse) // or parse(await fetch(options))

Se puede aplicar el mismo patrón para los globales: ya sea que sean parámetros explícitos de cada función o que sean parámetros de una función de módulo que contenga todos los demás como cierres. Luego, await las promesas globales solo una vez en el módulo, antes de declarar o ejecutar cualquier otra cosa, y luego use el valor de resultado simple.

// Bad: async function log(line) { if (await debugPromise) console.log(line); } async function parse(response) { await log("parsing") // do something return result; } … await parse(…) …

// Good: (async function mymodule() { const debug = await debugPromise; function log(line) { if (debug) console.log(line); } function parse(response) { log("parsing") // do something return result; } … parse(…) … }());