no versions found for ApplicationFrameworkReferences / Components/View/ProtoViewLogic/protoviewlogic_broadcast / en

ProtoViewLogic: broadcast()

対象の ProtoViewLogic インスタンスの子孫へ同一メッセージを送ります。

この関数は非同期関数です。

構文

protoViewLogic.broadcast(message) => Promise<boolean>

引数

  • message: object

    送信するメッセージです。 このオブジェクトは以下のプロパティを持ちます:

    • id: string | null

      メッセージの識別子です。

    • code: string | null

      メッセージの追加の識別子です。

    • param: any | null

      メッセージが持つパラメータです。

    • origin: object | null

      メッセージの生成元です。

返値: Promise<boolean>

送信したメッセージが消費されたかどうかを解決時に示すプロミスです。 true として解決された場合、メッセージが消費されたことを示し、false なら消費されなかったことを示します。

例外

  • TypeError
    • 引数 message が非 null のオブジェクトでなかった場合。
  • AggregateError
    • 子孫がメッセージ処理に失敗した場合。broadcast() 内で生じた例外をプロパティ errors: Error[] として持ちます。

import { ProtoViewLogic } from "/alier_sys/ProtoViewLogic.js";
import { ViewLogic      } from "/alier_sys/ProtoViewLogic.js";
import { AlierView      } from "/alier_sys/AlierView.js";

const vlParent = new ProtoViewLogic;

const pl = new class Polish extends ProtoViewLogic {
    async messageHandler(message) {
        message.deliver({
            greet: message => {
                console.log(`message.id = ${message.id}, message.code = ${message.code}: Witaj!`);
            }
        });
    }
};

const laHost = new AlierView();

//  AlierView に取り付けるためこれは派生クラスの ViewLogic を使う
const la = new class Latin extends ProtoViewLogic {
    async messageHandler(message) {
        message.deliver({
            saluto: message => {
                console.log(`message.id = ${message.id}, message.code = ${message.code}: Salvete!`);
            }
        });
    }
};

laHost.attach(la);

const en = new class English extends ProtoViewLogic {
    async messageHandler(message) {
        message.deliver({
            greet: message => {
                console.log(`message.id = ${message.id}, message.code = ${message.code}: Welcome!`);
            }
        });
    }
};

const jp = new class Japanese extends ProtoViewLogic {
    async messageHandler(message) {
        message.deliver({
            aisatsu: message => {
                console.log(`message.id = ${message.id}, message.code = ${message.code}: いらっしゃい!`);
            }
        });
    }
};

//  事前準備: 親子関係を作る
vlParent.relateViewLogics({ en, pl });
en.relateViewLogics({ jp });
pl.relateElements({ laHost });
//  これは以下の木構造を作る:
//  vlParent --- en --- jp
//            `- pl ... la

console.group("broadcast: id = greet");
await vlParent.broadcast(vlParent.message("greet", null, null));
// => 以下のログが表示される:
//    "message.id = greet, message.code = default: Welcome!"
//    "message.id = greet, message.code = default: Witaj!"
console.groupEnd();

console.group("broadcast: id = aisatsu");
await vlParent.broadcast(vlParent.message("aisatsu", null, null));
// => 以下のログが表示される:
//    "message.id = aisatsu, message.code = default: いらっしゃい!"

console.group("broadcast: id = saluto");
await vlParent.broadcast(vlParent.message("saluto", null, null));
// => 以下のログが表示される:
//    "message.id = saluto, message.code = default: Salvete!"
console.groupEnd();

解説

メッセージ処理は直接の子から行われます。もしメッセージが未消費の子があれば、未消費だった子からその子孫へ送られます。 ここで「子孫」とは、relateViewLogics() によって関連付けられた直接の子孫ProtoViewLogic に加えて、relateElements() によって関連付けられた Elementlogic プロパティを介して参照される、実質的な子孫ProtoViewLogic を含めます。 実質的な子孫には例えば、AlierViewattach() 関数によって取り付けられた ViewLogic が該当します。

Broadcast Image

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

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

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

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