w3schools trabajar then promises promesas platzi ejemplo con anidadas javascript promise dispose bluebird

javascript - trabajar - ¿Cuál es el patrón de eliminación de promesas?



promises js (1)

El problema con tu código

El problema con el enfoque anterior es que si olvida liberar la conexión después de cada vez que realiza getDb , tiene una fuga de recursos que podría congelar su aplicación eventualmente cuando se quede sin el recurso que está perdiendo.

Puede, en un lugar, hacer:

var users = getDb().then(function(conn){ return conn.query("SELECT name FROM users"); });

Lo cual filtrará una conexión de base de datos que nunca se cerró.

El patrón de disposición

El patrón de disposición es una forma de acoplar un alcance de código con la propiedad del recurso. Al vincular el recurso a un ámbito, nos aseguramos de que siempre se publique cuando hayamos terminado con él y no podemos olvidarlo fácilmente. Es similar al using en C #, with Python y try-with-resource en Java, así como RAII en C ++.

Parece que:

withResource(function(resource){ return fnThatDoesWorkWithResource(resource); // returns a promise }).then(function(result){ // resource disposed here });

Aplicándolo aquí

Si escribimos nuestro código como:

function withDb(work){ var _db; return myDbDriver.getConnection().then(function(db){ _db = db; // keep reference return work(db); // perform work on db }).finally(function(){ if (_db) _db.release(); }); }

Podríamos escribir nuestro código anterior como:

withDb(function(conn){ return conn.query("SELECT name FROM users"); }).then(function(users){ // connection released here });

Ejemplos de usuarios del patrón de disposición son sequelize y knex (generador de consultas de estantería). También es posible usarlo para cosas más simples como ocultar un cargador cuando todas las solicitudes de AJAX se completan, por ejemplo.

Azulejo

Dado que está utilizando bluebird, tiene Promise.using dedicadas Promise.using y .disposer incorporadas que le permiten manejar tomar / liberar múltiples recursos a la vez que tal vez desee considerar.

He leído sobre el patrón de eliminación de promesas en varios lugares, pero no puedo entender cuál es. Me sugirieron usarlo en un código que se vea así:

function getDb(){ return myDbDriver.getConnection(); } var users = getDb().then(function(conn){ return conn.query("SELECT name FROM users").finally(function(users){ conn.release(); }); });

¿Cuál es el patrón de eliminación de promesas y cómo se aplica aquí?

Nota: en las promesas nativas, calzo .finally como "agregar manejadores de rechazo y cumplimiento que devuelven el valor pero realizan una acción". Estoy usando bluebird en este caso si es importante.