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.