あらかじめ日記

2chまとめサイト「ソノウソホント?」の雑記と、ブログで使えるスクリプトとかテクニックとか。その他、音楽やアニメ、漫画の話題とかも。

【Electron】プロセス間通信(IPC)でハマったこと(send-onに注意)

最近、少しElectronなるものを触ってみました。

Electronは、GitHubが開発したオープンソースのソフトウェアフレームワークである。 ChromiumとNode.jsを使っており、HTML、CSSJavaScriptのようなWeb技術で、macOSWindowsLinuxに対応したデスクトップアプリケーションをつくることができる。 - Wikipediaより

 Electronは、そのアーキテクトとしてメイン(Node.js)側とレンダリング(ブラウザ)側でプロセスが分かれているのですが、その双方の通信を行いたい場合はElectronが持つipcRendererを使って容易に行えます。
ここでちょっとハマってしまったことの覚え書き。

同期で通信する場合はsendSync、非同期の場合はsendメソッドで送って、受け取る時はonメソッドでコールバックを登録しておくのですが実はこのonに注意が必要。
素人が書くとこう書いてしまいがち?(自分だけかも。。)

var ipcRenderer = require('electron').ipcRenderer;
・・・
public test() {
    ipcRenderer.send('test-message', "hello");
    ipcRenderer.on('test-reply', (e:any, a:any) => {
  }
}

先にも書きましたがonイベントハンドラへの“登録”onすることで登録されるので、呼び出される度に登録される、 つまりメイン側からの呼び出し先は登録された全てなので複数回呼ばれているように動きになってしまうのです。

一回目は問題なく動く分、できたと思って動かしていると、以降不要な呼び出しが起きて期待通りの動きになったりならなかったりして、ちょっとハマりました。
なので、onを使うのであればクラスメソッドのスコープから外したグローバル空間で書いておく必要があります。
もしくは、上記のように書くのであれば1度だけ受信を受け付けるonceが使えるので、ononceに置き換えてもOKでしょう。