MessagePorter: addListener()
対象の MessagePorter にリスナーを登録します。
構文
messagePorter.addListener(listener) => function | undefined
引数
-
listener:functionリスナーとして登録する関数です。関数は
messageというany型の引数を取り、undefined,boolean,Promise<void>のいずれかを返します。
返値: function | undefined
引数 listener がリスナーとして登録されれば listener 自身、そうでなければ undefined となります。既に登録されていた場合も listener 自身となります。 listener が関数でない場合には、 listener を登録できないため undefined が返されます。
例
const messagePorter = new MessagePorter();
const firstAdded = (message) => {
console.log(firstAdded.name, message);
};
const abort = (message) => {
console.log(abort.name, message);
return true;
};
const lastAdded = (message) => {
console.log(lastAdded.name, message);
};
let added;
// firstAdded を messagePorter に登録する
added = messagePorter.addListener(firstAdded);
// 登録結果の確認
console.log(added === firstAdded);
// ==> true
// abort を messagePorter に登録する
added = messagePorter.addListener(abort);
// 登録結果の確認
console.log(added === abort);
// ==> true
// lastAdded を messagePorter に登録する
added = messagePorter.addListener(lastAdded);
// 登録結果の確認
console.log(added === lastAdded);
// ==> true
// function でない値を渡す
added = messagePorter.addListener("not-a-function");
// 登録結果の確認
console.log(added === undefined);
// ==> true
// 登録済みの関数を渡す
// これは後続の post() の結果に影響しない。
// messagePorter の内部状態は変更されない)。
added = messagePorter.addListener(firstAdded);
// 登録結果の確認
console.log(added === firstAdded);
// ==> true
// イベントリスナーの呼び出し
// firstAdded は、abort が true を返すため、呼び出されない
messagePorter.post({
id: "foo",
code: "bar",
param: {
param0: 1,
param1: true,
param2: "string"
}
});
// ==> "lastAdded" [object Object]
// ==> "abort" [object Object]
解説
対象の MessagePorter にリスナーを登録します。
登録されたリスナーは、対象の MessagePorter に対する post() の呼び出しを契機として呼び出されます。リスナーの引数 message は post() の引数として与えられます。またリスナーの返値は同一の MessagePorter に登録されている他のリスナーの呼び出しを行うかどうかを示し、true なら後続のリスナーの呼び出しは行われません。
登録されたリスナーの呼び出し順序は、addLisener() で登録した順序と逆順になります。例えば listener1, listener2, listener3 の順に登録した場合、post() の呼び出しに際し、listener3, listener2, listener1 の順にリスナーが呼び出されます。
引数 listener が関数でない場合、addListener() は何も行いません。