في المرة الأخيرة التي درست فيها وضع المراقب ، قال العديد من المقالات إنه يسمى أيضًا الاشتراك/النشر (وضع النشر/الاشتراك). ولكن في كتاب "نمط تصميم JavaScript" ، لا يزال هناك بعض الاختلافات بين النموذجين. الكلمات الأصلية في الكتاب هي كما يلي:
1. يتطلب وضع المراقب المراقبين الذين يرغبون في تلقي إشعارات الموضوع الاشتراك في الأحداث التي يتغير فيها المحتوى.
2. وضع Subscribe/Publish يستخدم قناة موضوع/حدث ، وهو بين المشترك والناشر. يتيح نظام الحدث الكود بتحديد أحداث محددة للتطبيق ، والتي يمكن أن تمرير معلمات مخصصة تحتوي على القيم المطلوبة من قبل المشترك. والغرض من ذلك هو تجنب التبعيات بين المشتركين والناشرين.
الفرق من وضع المراقب هو أنه يسمح لأي مشترك بتنفيذ معالجات الأحداث المناسبة للتسجيل وتلقي الإخطارات من الناشرين.
حسنًا ، لا أعرف كيف أكون قويًا جدًا. ها هو فهمي:
1. في وضع المراقب ، يكون الكائن الهدف مسؤولاً عن الحفاظ على المراقب. في وضع النشر/الاشتراك ، لا يهتم الناشرون بالمشتركين ، فهم مسؤولون فقط عن طرح الرسائل وتركها وحدها.
2. في وضع المراقب ، يحتاج المراقب إلى توفير واجهة ، ثم استدعاء هذه الواجهة عندما يتغير الكائن المستهدف للحفاظ على حالته الخاصة والحالة المستهدفة متسقة. أي أن جميع المراقبين يجب أن يكون لديهم واجهة موحدة (على سبيل المثال ، طريقة التحديث المكتوبة أعلاه ، يجب أن تسمى طريقة الجميع هذا الاسم). في وضع النشر/الاشتراك ، لا يعتمد تشغيل حدث المشترك على مثل هذه الواجهة ، ولكن يتم تشغيله بواسطة المشترك من خلال الاستماع إلى رسالة محددة (تحتوي هذه الرسالة عمومًا على الاسم والمعلمات المطلوبة من قبل المشترك). يمكن فهم أن المشترك لا يستمع إلى الناشر ، ولكن تجمع الرسائل. طالما أن هناك رسالة تهتم بها في تجمع الرسائل ، فإنها تدور الحدث ، بغض النظر عمن نشر الرسالة في الماضي. يتم فصل الناشرين والمشتركين.
فيما يلي تنفيذ وضع النشر/الاشتراك في JS. نسخها ولصقها في وحدة التحكم وسوف تفهمها بعد المحاولة:
نسخة الكود كما يلي:
var pubsub = (function () {
var q = {}
موضوعات = {} ،
subuid = -1 ؛
// نشر رسالة
Q.Publish = function (topic ، args) {
if (! موضوعات [الموضوع]) {return ؛}
var subs = موضوعات [الموضوع] ،
len = subs.length ؛
بينما (لين-) {
الغواصات [len] .func (الموضوع ، args) ؛
}
إرجاع هذا ؛
} ؛
// الاشتراك في الأحداث
Q.Subscribe = function (topic ، func) {
موضوعات [الموضوع] = موضوعات [الموضوع]؟ موضوعات [الموضوع]: [] ؛
var token = (++ subuid) .toString () ؛
موضوعات [الموضوع] .push ({
الرمز المميز: رمز ،
FUNC: FUNC
}) ؛
الرمز الرمز المميز.
} ؛
العودة س ؛
// قم بإلغاء الاشتراك والتوقف عن الكتابة ، وتجارة المواضيع ، ثم إعادة الرمز الرمزي عن طريق حفظ العنصر السابق ، حذف العنصر المحدد
}) () ؛
// حدث الحدث
var logmsg = function (موضوعات ، البيانات) {
console.log ("التسجيل:" + موضوعات + ":" + بيانات) ؛
}
// استمع إلى الرسالة المحددة "msgname"
var sub = pubsub.subscribe ('msgname' ، logmsg) ؛
// نشر رسالة "msgname"
pubSub.publish ('msgname' ، 'hello world') ؛
// نشر رسالة غير مدرجة 'msgname1'
pubSub.publish ('OtherMsgname' ، 'me ote!') ؛