2020-03-15

Node.jsで仮想通貨の自動取引(bitFlyer編 #5) Realtime API公式コードを読む(3)

今回からはSocket.ioのお話に入っていく。またfor文のin,ofに関しては詳しく説明してみる。

Article Image

今回のコード

今回はこのあたりを解説する(分かりやすいよう前回の分も含んである)

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。この概念がわかりにくい。

あとの構文は簡単だ。errnullでなければエラー表示されて処理が終了する。そうでなければSubscribedと表示される。

余談:また第三引数に戻ってくる値はサーバー側が自由に決められるので仕様によってはエラーだけでなく別の情報を付加したりもできる。

今回はここまで

毎回少しづつ進めているが今回はコールバック関数のおさらいという感じになった。

このあたり理解しにくい概念でもあるので他のサイトも合わせしっかり学習しておきたい項目だ。



この記事をシェア


謎の技術研究部 (謎技研)