Responder
- Root
- 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
- import { defclass, sendmsg, supersend } from 'So-o';
- defclass('Responder', null, 1,
- null,
- ['nextResponders'],
- 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
- { '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
- '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
- 'addNextResponder':
- (self, r) => {
- let responders = sendmsg(self, 'get', 'nextResponders');
- if (!responders)
- sendmsg(self, 'set', 'nextResponders', [r]);
- else {
- if (responders.indexOf(r) == -1)
- responders.push(r);
- }
- return self;
- },
removeNextResponder
SYNOPSIS
sendmsg(self, 'removeNextResponder', r)
DESCRIPTION
removeNextResponder
retire r
de la liste des répondeurs de self
.
CODE
- 'removeNextResponder':
- (self, r) => {
- let responders = sendmsg(self, 'get', 'nextResponders');
- if (responders) {
- let i = responders.indexOf(r);
- if (i != -1)
- responders.splice(i, 1);
- }
- return self;
- },
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
- 'respondTo':
- (self, msg, ...args) => {
- if (sendmsg(self, 'respondsTo', msg) && sendmsg(self, msg, ...args))
- return self;
- let responders = sendmsg(self, 'get', 'nextResponders');
- if (responders) {
- for (let r of responders)
- sendmsg(r, 'respondTo', msg, ...args);
- }
- return self;
- }
- }
- );
EXEMPLE
Une instance de Button notifie le message clicked quand elle reçoit le message click :
- import { defclass, sendmsg } from 'So-o';
- import 'Responder';
- defclass('Button', Responder, 1,
- null,
- null,
- null,
- { 'click': (self) => {
- console.log(self + ' clicked');
- sendmsg(self, 'respondTo', 'clicked', self);
- },
- }
- );
click
affiche un message de trace puis notifie le message clicked.
Une instance de Action répond à clicked :
- import { defclass, sendmsg } from 'So-o';
- import 'Responder';
- defclass('Action', Responder, 1,
- null,
- null,
- null,
- { 'clicked': (self, sender) => {
- console.log(self + ' clicked from ' + sender);
- return false;
- }
- }
- );
Une instance de AnotherAction répond aussi à clicked
mais retourne true
:
- import { defclass, sendmsg } from 'So-o';
- import 'Responder';
- defclass('AnotherAction', Responder, 1,
- null,
- null,
- null,
- { 'clicked': (self, sender) => {
- console.log(self + ' clicked from ' + sender);
- return true;
- }
- }
- );
- import { sendmsg } from 'So-o';
- import 'Button';
- var btn = sendmsg(Button, 'new');
- sendmsg(btn, 'click');
Crée une instance de Button et lui envoie le message click.
clicked est affiché par btn
.
- import 'Action';
- var act1 = sendmsg(Action, 'new');
- sendmsg(btn, 'addNextResponder', act1);
- 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
.
- import 'AnotherAction';
- var act2 = sendmsg(AnotherAction, 'new');
- sendmsg(btn, 'addNextResponder', act2);
- 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
.
- sendmsg(btn, 'removeNextResponder', act2);
- 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.
- sendmsg(act1, 'addNextResponder', act2);
- 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
.
- sendmsg(btn, 'removeNextResponder', act1);
- sendmsg(act1, 'removeNextResponder', act2);
- 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
.
- sendmsg(act2, 'addNextResponder', act1);
- sendmsg(btn, 'addNextResponder', act2);
- 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