今回はこのあたりを解説する(分かりやすいよう前回の分も含んである)
for (const ch of publicChannels) {
の内側を見ていく。
// connection handling
socket.on("connect", () => {
// subscribe to the Public Channels
for (const ch of publicChannels) {
socket.emit("subscribe", ch, err => {
if (err) {
console.error(ch, "Subscribe Error:", err);
return;
}
console.log(ch, "Subscribed.");
});
}
socket.emit
とはあたらしくemit
というメソッドが呼ばれた。
以前にsocket.on
というメソッドで接続を確立すると述べたがon
メソッドは相手からのデータを「受信」するメソッドだ。これに対してemit
は相手側に送信するメソッドであり、これを日本語では「発火する」と表現する。
引数は3つあり ( "subscribe"
, ch
, 関数
)となっている。
第一引数の"subscribe"
というイベントを発火してサーバーに送信している。このstringは設計者が自由に決めてよいのでbitFlyer API側の「決まりごと」である。これにより特定のデータを「購読しますよ」と通知してデータがこちら側に送信され始める。
第二引数は自明のため省略。第三引数の関数を見ていく。
err => { ... }
前回説明したようにこれをコールバック関数と呼ぶ。ここで重要なのはerr
を引数に入れているのではない。初心者が躓くポイントだ。
わかりにくいのでこのemit
内の手順を日本語で説明すると
「サーバー側がemit
の第一、第二引数を受け取ってなんらかの処理を実行する。その処理による戻り値を第三引数に入っている関数に渡して実行。この際引数に渡す値にはエラー内容が入っており、エラーが無かった時はnull
が入る」といった感じだ。
そこで、戻ってきた値を入れてやる箱がerr
。この概念がわかりにくい。
あとの構文は簡単だ。err
がnull
でなければエラー表示されて処理が終了する。そうでなければSubscribed
と表示される。
余談:また第三引数に戻ってくる値はサーバー側が自由に決められるので仕様によってはエラーだけでなく別の情報を付加したりもできる。
毎回少しづつ進めているが今回はコールバック関数のおさらいという感じになった。
このあたり理解しにくい概念でもあるので他のサイトも合わせしっかり学習しておきたい項目だ。