Verstehen des Promise-Disposer-Musters
Sie sind in Ihrem Code auf das Promise-Disposer-Muster gestoßen, dessen Zweck jedoch noch unklar ist. Dieser Artikel soll das Konzept verdeutlichen und seine Anwendung demonstrieren.
Problemübersicht
In Ihrem Code-Snippet:
function getDb() {
return myDbDriver.getConnection();
}
var users = getDb().then(function (conn) {
return conn.query("SELECT name FROM users").finally(function (users) {
conn.release();
});
});
Sie stehen vor dem Problem potenzieller Ressourcenlecks, wenn Sie es versäumen, die Datenbankverbindung nach jedem getDb-Aufruf freizugeben. Dies kann zum Einfrieren des Systems führen, wenn die Ressourcengrenzen überschritten werden.
Einführung in das Disposer-Muster
Das Promise-Disposer-Muster stellt eine starke Verbindung zwischen einem Codebereich und der darin enthaltenen Ressource her besitzt. Indem Sie die Ressource an den Umfang binden, stellen Sie sicher, dass sie nach Abschluss des Umfangs umgehend freigegeben wird, und eliminieren so das Risiko einer Versehen. Dieses Muster weist Ähnlichkeiten mit C#s using, Pythons with, Javas try-with-resource und Cs RAII auf.
Musterstruktur
Das Disposer-Muster folgt einem bestimmten Struktur:
withResource(function (resource) {
return fnThatDoesWorkWithResource(resource); // returns a promise
}).then(function (result) {
// resource disposed here
});
Anwenden auf Ihren Code
Durch Umgestaltung Ihres Codes in das Disposer-Muster:
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();
});
}
Sie können Ihren vorherigen Code jetzt wie folgt umschreiben:
withDb(function (conn) {
return conn.query("SELECT name FROM users");
}).then(function (users) {
// connection released here
});
Stellen Sie sicher, dass die Ressource innerhalb des „finally“-Blocks freigegeben wird, um eine ordnungsgemäße Entsorgung zu gewährleisten.
Beispiele aus der Praxis
Bemerkenswerte Beispiele dafür Zu den Entsorgermustern in der Praxis gehören Sequelize und Knex (Bookshelfs Abfrage-Builder). Seine Anwendungen erstrecken sich auf die Verwaltung komplexer asynchroner Prozesse, wie etwa das Ein- und Ausblenden von Ladeindikatoren basierend auf dem Abschluss mehrerer AJAX-Anfragen.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3