ProtoViewLogic: broadcast()
対象の ProtoViewLogic
インスタンスの子孫へ同一メッセージを送ります。
この関数は非同期関数です。
構文
ProtoViewLogic.broadcast(msg) => Promise<boolean>
引数
-
msg
:{ id, code, param, origin }
処理するメッセージオブジェクトです。通常は
message()
で得られるメッセージと同じ意味のものです。
返値: Promise<boolean>
依頼されたメッセージが消費されたかどうかを返すプロミスです。true
ならメッセージが処理されたことを示し、false
なら未処理であることを示します。
例外
TypeError
- 引数
msg
が非null
のオブジェクトでなかった場合。
- 引数
AggregateError
- 子孫がメッセージ処理に失敗した場合。
broadcast()
内で生じた例外をプロパティerrors: Error[]
として持ちます。
- 子孫がメッセージ処理に失敗した場合。
例
// SP
const { ProtoViewLogic } = await Alier.import("/alier_sys/ProtoViewLogic.js");
// Web
// import { ProtoViewLogic } from "/path/to/alier/src/ProtoViewLogic.js";
const vlParent = new ProtoViewLogic;
const pl = new class Polish extends ProtoViewLogic {
async messageHandler(msg) {
msg.deliver({
greet: (msg) => {
console.log(`msg.id = ${msg.id}, msg.code = ${msg.code}: Witaj!`);
}
});
}
};
const en = new class English extends ProtoViewLogic {
async messageHandler(msg) {
msg.deliver({
greet: (msg) => {
console.log(`msg.id = ${msg.id}, msg.code = ${msg.code}: Welcome!`);
}
});
}
};
const jp = new class Japanese extends ProtoViewLogic {
async messageHandler(msg) {
msg.deliver({
aisatsu: (msg) => {
console.log(`msg.id = ${msg.id}, msg.code = ${msg.code}: いらっしゃい!`);
}
});
}
};
// 事前準備: 親子関係を作る
vlParent.relateViewLogics({ en, pl });
en.relateViewLogics({ jp });
// これは以下の木構造を作る:
// vlParent --- en --- jp
// `- pl
console.group("broadcast: id = greet");
await vlParent.broadcast(vlParent.message("greet", null, null));
// => 以下のログが表示される:
// "msg.id = greet, msg.code = default: Welcome!"
// "msg.id = greet, msg.code = default: Witaj!"
console.groupEnd();
console.group("broadcast: id = aisatsu");
await vlParent.broadcast(vlParent.message("aisatsu", null, null));
// => 以下のログが表示される:
// "msg.id = aisatsu, msg.code = default: いらっしゃい!"
console.groupEnd();
解説
メッセージ処理は直接の子から行われます。もしメッセージが未消費の子があれば、未消費だった子からその子孫へ送られます。
メッセージ処理では post()
と同様に messageHandler()
が呼び出されます。
ただし post()
と異なり、親や祖先へのメッセージ伝播は行われません。つまり、broadcast()
したメッセージは「逆流」しません。
messageHandler()
の中で何らかの例外が発生した場合、例外を発生させた ProtoViewLogic
の子孫へはメッセージが送られません(メッセージは 消費された と見なされる)。
その他の子孫に対するメッセージ処理と伝播は引き続き行われますが、broadcast()
の呼び出し自体は呼び出し中に発生した例外をまとめた AggregateError
を発生させます。