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[] として持ちます。

import { ProtoViewLogic } from "/alier_sys/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();

解説

メッセージ処理は直接の子から行われます。もしメッセージが未消費の子があれば、未消費だった子からその子孫へ送られます。

Broadcast Image

メッセージ処理では post() と同様に messageHandler() が呼び出されます。

ただし post() と異なり、親や祖先へのメッセージ伝播は行われません。つまり、broadcast() したメッセージは「逆流」しません。

messageHandler() の中で何らかの例外が発生した場合、例外を発生させた ProtoViewLogic の子孫へはメッセージが送られません(メッセージは 消費された と見なされる)。

その他の子孫に対するメッセージ処理と伝播は引き続き行われますが、broadcast() の呼び出し自体は呼び出し中に発生した例外をまとめた AggregateError を発生させます。