فهم نمط المتخلص من الوعد
لقد واجهت نمط المتخلص من الوعد في التعليمات البرمجية الخاصة بك، ولكن الغرض منه لا يزال بعيد المنال. تهدف هذه المقالة إلى توضيح المفهوم وإظهار تطبيقه.
نظرة عامة على المشكلة
في مقتطف التعليمات البرمجية الخاص بك:
function getDb() {
return myDbDriver.getConnection();
}
var users = getDb().then(function (conn) {
return conn.query("SELECT name FROM users").finally(function (users) {
conn.release();
});
});
تواجه مشكلة تسرب الموارد المحتملة إذا أهملت تحرير اتصال قاعدة البيانات بعد كل استدعاء getDb. يمكن أن يؤدي هذا إلى تجميد النظام في حالة تجاوز حدود الموارد.
تقديم نمط المتخلص
ينشئ نمط المتخلص الوعدي اتصالاً قويًا بين نطاق التعليمات البرمجية والمورد الذي يستخدمه يمتلك. من خلال ربط المورد بالنطاق، فإنك تضمن إطلاقه الفوري عند انتهاء النطاق، مما يزيل مخاطر الرقابة. يحمل هذا النمط أوجه تشابه مع استخدام C#، وPython's with، وJava's Try-with-resource، وC 's RAII.
بنية النمط
يتبع نمط المتخلص نمطًا محددًا الهيكل:
withResource(function (resource) {
return fnThatDoesWorkWithResource(resource); // returns a promise
}).then(function (result) {
// resource disposed here
});
تطبيقه على الكود الخاص بك
من خلال إعادة هيكلة الكود الخاص بك في نمط المتخلص:
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();
});
}
يمكنك الآن إعادة كتابة الكود السابق على النحو التالي:
withDb(function (conn) {
return conn.query("SELECT name FROM users");
}).then(function (users) {
// connection released here
});
تأكد من تحرير المورد داخل الكتلة النهائية لضمان التخلص السليم.
أمثلة من العالم الحقيقي
أمثلة بارزة على يتضمن نمط المتخلص عمليًا Sequelize وKnex (أداة إنشاء الاستعلامات الخاصة بـ Bookshelf). تمتد تطبيقاته إلى إدارة العمليات غير المتزامنة المعقدة، مثل إظهار وإخفاء مؤشرات التحميل بناءً على إكمال طلبات AJAX المتعددة.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3