5

Responder

  1. Root
    1. Responder

Une instance de Responder envoie automatiquement des messages de notification à une ou plusieurs instances. Des instances de Responder peuvent être liées afin que les notifications soient automatiquement transmises d'un répondeur à un autre.

MÉTHODES D'INSTANCE

  1. import { defclass, sendmsg, supersend } from 'So-o';
  2.  
  3. defclass('Responder', null, 1,
  4.     null,
  5.     ['nextResponders'],
  6.     null,

La classe Responder hérite de la classe Root. La propriété d'instance nextResponders contient la liste des instances qui ont demandé à être notifiées lorsqu'un événement se produit. La classe Responder ajoute les messages nextResponders, setNextResponders, addNextResponder, removeNextResponder et respondTo.

nextResponders
SYNOPSIS

sendmsg(self, 'nextResponders')

DESCRIPTION

nextResponders retourne la liste des répondeurs de self, un tableau d'instances.

CODE
  1.     {   'nextResponders':       (self) => sendmsg(self, 'get', 'nextResponders'),
setNextResponders
SYNOPSIS

sendmsg(self, 'setNextResponders', responders)

DESCRIPTION

setNextResponders initialise la liste des répondeurs de self à responders. responders est un tableau d'instances.

CODE
  1.         'setNextResponders':    (self, responders) => sendmsg(self, 'set', 'nextResponders', responders),
addNextResponder
SYNOPSIS

sendmsg(self, 'addNextResponder', r)

DESCRIPTION

addNextResponder ajoute r à la liste des répondeurs de self.

CODE
  1.         'addNextResponder':
  2.             (self, r) => {
  3.                 let responders = sendmsg(self, 'get', 'nextResponders');
  4.  
  5.                 if (!responders)
  6.                     sendmsg(self, 'set', 'nextResponders', [r]);
  7.                 else {
  8.                     if (responders.indexOf(r) == -1)
  9.                         responders.push(r);
  10.                 }
  11.  
  12.                 return self;
  13.             },
removeNextResponder
SYNOPSIS

sendmsg(self, 'removeNextResponder', r)

DESCRIPTION

removeNextResponder retire r de la liste des répondeurs de self.

CODE
  1.         'removeNextResponder':
  2.             (self, r) => {
  3.                 let responders = sendmsg(self, 'get', 'nextResponders');
  4.  
  5.                 if (responders) {
  6.                     let i = responders.indexOf(r);
  7.                    
  8.                     if (i != -1)
  9.                         responders.splice(i, 1);
  10.                 }
  11.    
  12.                 return self;
  13.             },
respondTo
SYNOPSIS

sendmsg($self, 'respondTo', msg[, arg ...])

DESCRIPTION

Si self répond à msg, respondTo envoie msg et ses paramètres arg à self. Si self ne répond pas à msg ou si l'exécution du message retourne false, respondTo transmet le message et ses paramètres à toutes les instances de la liste des répondeurs de self.

CODE
  1.         'respondTo':
  2.             (self, msg, ...args) => {
  3.                 if (sendmsg(self, 'respondsTo', msg) && sendmsg(self, msg, ...args))
  4.                     return self;
  5.  
  6.                 let responders = sendmsg(self, 'get', 'nextResponders');
  7.                
  8.                 if (responders) {
  9.                     for (let r of responders)
  10.                         sendmsg(r, 'respondTo', msg, ...args);
  11.                 }
  12.  
  13.                 return self;
  14.             }
  15.     }
  16. );
EXEMPLE

Une instance de Button notifie le message clicked quand elle reçoit le message click :

  1. import { defclass, sendmsg } from 'So-o';
  2.  
  3. import 'Responder';
  4.  
  5. defclass('Button', Responder, 1,
  6.     null,
  7.     null,
  8.     null,
  9.     {   'click':    (self) => {
  10.                         console.log(self + ' clicked');
  11.  
  12.                         sendmsg(self, 'respondTo', 'clicked', self);
  13.                     },
  14.     }
  15. );

click affiche un message de trace puis notifie le message clicked.

Une instance de Action répond à clicked :

  1. import { defclass, sendmsg } from 'So-o';
  2.  
  3. import 'Responder';
  4.  
  5. defclass('Action', Responder, 1,
  6.     null,
  7.     null,
  8.     null,
  9.     {   'clicked':  (self, sender) => {
  10.                         console.log(self + ' clicked from ' + sender);
  11.  
  12.                         return false;
  13.                     }
  14.     }
  15. );

Une instance de AnotherAction répond aussi à clicked mais retourne true :

  1. import { defclass, sendmsg } from 'So-o';
  2.  
  3. import 'Responder';
  4.  
  5. defclass('AnotherAction', Responder, 1,
  6.     null,
  7.     null,
  8.     null,
  9.     {   'clicked':  (self, sender) => {
  10.                         console.log(self + ' clicked from ' + sender);
  11.  
  12.                         return true;
  13.                     }
  14.     }
  15. );
  1. import { sendmsg } from 'So-o';
  2.  
  3. import 'Button';
  4.  
  5. var btn = sendmsg(Button, 'new');
  6.  
  7. sendmsg(btn, 'click');

Crée une instance de Button et lui envoie le message click.

clicked est affiché par btn.

  1. import 'Action';
  2.  
  3. var act1 = sendmsg(Action, 'new');
  4.  
  5. sendmsg(btn, 'addNextResponder', act1);
  6. sendmsg(btn, 'click');

Crée une instance de Action et l'ajoute comme répondeur à l'instance de Button. Envoie le message click au bouton.

clicked est affiché par btn qui le renvoie à act1.

  1. import 'AnotherAction';
  2.  
  3. var act2 = sendmsg(AnotherAction, 'new');
  4.  
  5. sendmsg(btn, 'addNextResponder', act2);
  6. sendmsg(btn, 'click');

Crée une instance de AnotherAction et l'ajoute comme répondeur à l'instance de Button. Envoie le message click au bouton.

clicked est envoyé par btn à act1 puis à act2.

  1. sendmsg(btn, 'removeNextResponder', act2);
  2. sendmsg(btn, 'click');

Retire l'instance de AnotherAction de la liste des répondeurs de l'instance de Button. Envoie le message click au bouton.

act2 ne reçoit plus le message clicked.

  1. sendmsg(act1, 'addNextResponder', act2);
  2. sendmsg(btn, 'click');

Ajoute l'instance de AnotherAction à la liste des répondeurs de l'instance de Action. Envoie le message click au bouton.

clicked est envoyé au répondeur de btn puis au répondeur de act1.

  1. sendmsg(btn, 'removeNextResponder', act1);
  2. sendmsg(act1, 'removeNextResponder', act2);
  3. sendmsg(btn, 'click');

Retire l'instance de Action de la liste des répondeurs de l'instance de Button. Retire l'instance de AnotherAction de la liste des répondeurs de l'instance de Action. Envoie le message click au bouton.

clicked est affiché par btn.

  1. sendmsg(act2, 'addNextResponder', act1);
  2. sendmsg(btn, 'addNextResponder', act2);
  3. sendmsg(btn, 'click');

Ajoute l'instance de Action à la liste des répondeurs de l'instance de AnotherAction. Ajoute l'instance de AnotherAction à la liste des répondeurs de l'instance de Button. Envoie le message click au bouton.

clicked est envoyé par btn à act2 qui retourne true et bloque l'envoi du message à act1.

$ ln Responder.js node_modules/Responder.mjs
$ ln testResponder.js testResponder.mjs
$ nodejs --experimental-modules testResponder
object(Button) clicked
object(Button) clicked
object(Action) clicked from object(Button)
object(Button) clicked
object(Action) clicked from object(Button)
object(AnotherAction) clicked from object(Button)
object(Button) clicked
object(Action) clicked from object(Button)
object(Button) clicked
object(Action) clicked from object(Button)
object(AnotherAction) clicked from object(Button)
object(Button) clicked
object(Button) clicked
object(AnotherAction) clicked from object(Button)

Commentaires

Votre commentaire :
[p] [b] [i] [u] [s] [quote] [pre] [br] [code] [url] [email] strip aide 2000

Entrez un maximum de 2000 caractères.
Améliorez la présentation de votre texte avec les balises de formatage suivantes :
[p]paragraphe[/p], [b]gras[/b], [i]italique[/i], [u]souligné[/u], [s]barré[/s], [quote]citation[/quote], [pre]tel quel[/pre], [br]à la ligne,
[url]http://www.izend.org[/url], [url=http://www.izend.org]site[/url], [email]izend@izend.org[/email], [email=izend@izend.org]izend[/email],
[code]commande[/code], [code=langage]code source en c, java, php, html, javascript, xml, css, sql, bash, dos, make, etc.[/code].