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()
は何も行いません。