jQuery 3.3

jQuery.Callbacks()




jquery

jQuery.Callbacks (flags) Returns: Callbacks

الوصف: كائن قائمة استدعاءات متعددة الأغراض يوفر طريقة فعالة لإدارة قوائم رد الاتصال.

  • وأضاف الإصدار: 1.7 jQuery.Callbacks (أعلام)

    • الأعلام
      اكتب: String
      قائمة اختيارية للأعلام التي تفصل بينها مسافات والتي تغير طريقة سلوك قائمة الاستدعاء.

يتم استخدام الدالة $.Callbacks() داخليًا لتوفير الوظائف الأساسية خلف $.ajax() jQuery $.ajax() و $.Deferred() . يمكن استخدامه كقاعدة مشابهة لتعريف الوظائف للمكونات الجديدة.

$.Callbacks() على عدد من الأساليب بما في ذلك callbacks.add() و callbacks.remove() و callbacks.fire() و callbacks.disable() .

ابدء

فيما يلي طريقتين عينة المسمى fn1 و fn2 :

function fn1( value ) {
  console.log( value );
}
 
function fn2( value ) {
  console.log( "fn2 says: " + value );
  return false;
}

يمكن إضافة هذه كـ callbacks إلى قائمة $.Callbacks كالتالي:

var callbacks = $.Callbacks();
callbacks.add( fn1 );
 
// Outputs: foo!
callbacks.fire( "foo!" );
 
callbacks.add( fn2 );
 
// Outputs: bar!, fn2 says: bar!
callbacks.fire( "bar!" );

نتيجة لذلك ، يصبح من السهل إنشاء قوائم معقدة من الاستدعاءات حيث يمكن تمرير قيم الإدخال إلى العديد من الوظائف حسب الحاجة بسهولة.

تم استخدام طريقتين محددة أعلاه: .add() و .fire() . يعتمد الأسلوب .add() إضافة عمليات الاسترجاعات الجديدة إلى قائمة رد الاتصال ، بينما ينفّذ الأسلوب .fire() الوظائف المضافة ويوفر طريقة لتمرير الوسائط التي تتم معالجتها بواسطة عمليات الاستدعاء في نفس القائمة.

أسلوب آخر مدعوم بواسطة $.Callbacks هو .remove() ، الذي لديه القدرة على إزالة رد اتصال معين من قائمة رد الاتصال. فيما يلي مثال عملي لـ .remove() المستخدمة:

var callbacks = $.Callbacks();
callbacks.add( fn1 );
 
// Outputs: foo!
callbacks.fire( "foo!" );
 
callbacks.add( fn2 );
 
// Outputs: bar!, fn2 says: bar!
callbacks.fire( "bar!" );
 
callbacks.remove( fn2 );
 
// Only outputs foobar, as fn2 has been removed.
callbacks.fire( "foobar" );

أعلام مدعومة

تعتبر وسيطة flags هي وسيطة اختيارية إلى $.Callbacks() ، $.Callbacks() تنظيمها كقائمة من سلاسل مفصولة $.Callbacks( "unique stopOnFalse" ) والتي تغير طريقة تصرف قائمة رد الاتصال (على سبيل المثال $.Callbacks( "unique stopOnFalse" ) ).

أعلام محتملة:

  • once : يضمن أن يتم تشغيل قائمة رد الاتصال مرة واحدة فقط (مثل مؤجل).
  • memory : يتتبع القيم السابقة وسيتصل بأي رد اتصال مضاف بعد إطلاق القائمة على الفور مع أحدث القيم "المحفوظة" (مثل مؤجل).
  • unique : يضمن أن تتم إضافة معاودة الاتصال مرة واحدة فقط (لذلك لا توجد تكرارات في القائمة).
  • stopOnFalse : Interrupts stopOnFalse عندما يقوم رد اتصال بإرجاع false.

بشكل افتراضي ، ستعمل قائمة الاستدعاءات مثل قائمة رد اتصال الحدث ويمكن "تشغيلها" عدة مرات.

للحصول على أمثلة حول كيفية استخدام flags بشكل مثالي ، انظر أدناه:

$.Callbacks( "once" ) :

var callbacks = $.Callbacks( "once" );
callbacks.add( fn1 );
callbacks.fire( "foo" );
callbacks.add( fn2 );
callbacks.fire( "bar" );
callbacks.remove( fn2 );
callbacks.fire( "foobar" );
 
/*
output:
foo
*/

$.Callbacks( "memory" ) :

var callbacks = $.Callbacks( "memory" );
callbacks.add( fn1 );
callbacks.fire( "foo" );
callbacks.add( fn2 );
callbacks.fire( "bar" );
callbacks.remove( fn2 );
callbacks.fire( "foobar" );
 
/*
output:
foo
fn2 says:foo
bar
fn2 says:bar
foobar
*/

$.Callbacks( "unique" ) :

var callbacks = $.Callbacks( "unique" );
callbacks.add( fn1 );
callbacks.fire( "foo" );
callbacks.add( fn1 ); // Repeat addition
callbacks.add( fn2 );
callbacks.fire( "bar" );
callbacks.remove( fn2 );
callbacks.fire( "foobar" );
 
/*
output:
foo
bar
fn2 says:bar
foobar
*/

$.Callbacks( "stopOnFalse" ) :

function fn1( value ) {
  console.log( value );
  return false;
}
 
function fn2( value ) {
  fn1( "fn2 says: " + value );
  return false;
}
 
var callbacks = $.Callbacks( "stopOnFalse" );
callbacks.add( fn1 );
callbacks.fire( "foo" );
callbacks.add( fn2 );
callbacks.fire( "bar" );
callbacks.remove( fn2 );
callbacks.fire( "foobar" );
 
/*
output:
foo
bar
foobar
*/

نظرًا لأن $.Callbacks() يدعم قائمة بالأعلام بدلاً من واحدة فقط ، فإن إعداد العديد من العلامات له تأثير تراكمي مشابه لـ "&&". هذا يعني أنه من الممكن دمج الأعلام لإنشاء قوائم رد اتصال ، والتي ، على سبيل المثال ، تكون فريدة من نوعها وتضمن ما إذا كانت القائمة قد تم إطلاقها بالفعل ، إضافة المزيد من عمليات الاسترجاعات سيتم استدعائها مع أحدث قيمة تم إطلاقها (أي $.Callbacks("unique memory") ) .

$.Callbacks( 'unique memory' ) :

function fn1( value ) {
  console.log( value );
  return false;
}
 
function fn2( value ) {
  fn1( "fn2 says: " + value );
  return false;
}
 
var callbacks = $.Callbacks( "unique memory" );
callbacks.add( fn1 );
callbacks.fire( "foo" );
callbacks.add( fn1 ); // Repeat addition
callbacks.add( fn2 );
callbacks.fire( "bar" );
callbacks.add( fn2 );
callbacks.fire( "baz" );
callbacks.remove( fn2 );
callbacks.fire( "foobar" );
 
/*
output:
foo
fn2 says:foo
bar
fn2 says:bar
baz
fn2 says:baz
foobar
*/

تكون مجموعات البيانات مع $.Callbacks() داخليًا في jQuery .done() و .fail() على مؤجل - كل منهما يستخدم $.Callbacks('memory once') .

يمكن أيضًا فصل أساليب $.Callbacks ، إذا كانت هناك حاجة إلى تحديد الإصدارات القصيرة $.Callbacks :

var callbacks = $.Callbacks(),
  add = callbacks.add,
  remove = callbacks.remove,
  fire = callbacks.fire;
 
add( fn1 );
fire( "hello world" );
remove( fn1 );

$ .Callbacks، $ .Deferred and Pub / Sub

الفكرة العامة وراء pub / sub (نشر / اشتراك ، أو نمط Observer) هي تعزيز اقتران فضفاض في التطبيقات. بدلاً من الأجسام المفردة التي تستدعي أساليب كائنات أخرى ، يوافق كائن بدلاً من ذلك على مهمة أو نشاط معين لكائن آخر ويتم إعلامه عند حدوثه. يسمى المراقبون أيضًا بالمشتركين ، ونشير إلى الكائن الذي تم رصده باعتباره الناشر (أو الموضوع). يخطر الناشرون المشتركين عند وقوع أحداث.

لشرح قدرات إنشاء المكون $.Callbacks() ، من الممكن تنفيذ نظام Pub / Sub باستخدام قوائم رد الاتصال فقط. باستخدام $.Callbacks مواضيع ، يمكن تنفيذ نظام للنشر والاشتراك في المواضيع على النحو التالي:

var topics = {};
 
jQuery.Topic = function( id ) {
  var callbacks, method,
    topic = id && topics[ id ];
 
  if ( !topic ) {
    callbacks = jQuery.Callbacks();
    topic = {
      publish: callbacks.fire,
      subscribe: callbacks.add,
      unsubscribe: callbacks.remove
    };
    if ( id ) {
      topics[ id ] = topic;
    }
  }
  return topic;
};

يمكن بعد ذلك استخدام أجزاء من تطبيقك لنشر أحداث مهمة والاشتراك فيها بسهولة تامة:

// Subscribers
$.Topic( "mailArrived" ).subscribe( fn1 );
$.Topic( "mailArrived" ).subscribe( fn2 );
$.Topic( "mailSent" ).subscribe( fn1 );
 
// Publisher
$.Topic( "mailArrived" ).publish( "hello world!" );
$.Topic( "mailSent" ).publish( "woo! mail!" );
 
// Here, "hello world!" gets pushed to fn1 and fn2
// when the "mailArrived" notification is published
// with "woo! mail!" also being pushed to fn1 when
// the "mailSent" notification is published.
 
/*
output:
hello world!
fn2 says: hello world!
woo! mail!
*/

على الرغم من أن ذلك مفيد ، إلا أنه يمكن مواصلة التنفيذ. باستخدام $.Deferreds ، من الممكن ضمان عدم نشر الناشرين للإشعارات إلا للمشتركين بمجرد الانتهاء من مهام معينة (حلها). انظر نموذج الكود التالي لبعض التعليقات الإضافية حول كيفية استخدام هذا في الممارسة:

// Subscribe to the mailArrived notification
$.Topic( "mailArrived" ).subscribe( fn1 );
 
// Create a new instance of Deferreds
var dfd = $.Deferred();
 
// Define a new topic (without directly publishing)
var topic = $.Topic( "mailArrived" );
 
// When the deferred has been resolved, publish a
// notification to subscribers
dfd.done( topic.publish );
 
// Here the Deferred is being resolved with a message
// that will be passed back to subscribers. It's possible to
// easily integrate this into a more complex routine
// (eg. waiting on an Ajax call to complete) so that
// messages are only published once the task has actually
// finished.
dfd.resolve( "it's been published!" );