ipcをPromiseで制御できるようにするモジュール
EventEmitterをPromiseで制御できるようにするライブラリでモジュールを作ったのだけど、 微妙な感じだったのでEventEmitterと広く捉えるのでなくてipc専用のモジュールとして別にipc-promiseを作ってみた。 今度はいい感じのような気がする。
リポジトリにあるテストのコードとほとんど変わらないのだけど、一応書いておく。
main process
Electron実行時に読み込むmain.jsを以下のように書く。
'use strict';
let app = require('app'),
BrowserWindow = require('browser-window'),
ipcPromise = require('ipc-promise');
let mainWindow;
// renderer向けのlistenerを登録
ipcPromise.on('to-main-from-renderer', function(params) {
// Promiseを返す
return new Promise(function(resolve, reject) {
if (params.value === 'main') {
resolve({ id: 42 });
} else {
reject(new Error('to-main-from-renderer'));
}
});
});
app.on('window-all-closed', function() {
if (process.platform !== 'darwin') {
app.quit();
}
});
app.on('ready', function() {
mainWindow = new BrowserWindow({
show: false
});
mainWindow.on('closed', function() {
mainWindow = null;
});
mainWindow.loadUrl(`file://${__dirname}/index.html`);
});
ipc-promiseでlistenerを登録する。listenerがPromiseを返すように書く以外はipcと変わらない。
あとはウィンドウを非表示にして生成しているだけ。
renderer process
Electronで表示させるページのindex.htmlと、そのページで実行するrenderer.jsを以下のように書く。
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ipc-promise</title>
</head>
<body>
<script src="ipc-promise.min.js"></script>
<script src="renderer.js"></script>
</body>
</html>
ipc-promiseとrenderer.jsを読み込むだけのHTMLを書く。
renderer.js
(function(){
'use strict';
ipcPromise
// mainにsendする
.send('to-main-from-renderer', {
value: 'main'
})
.then(function(result) {
console.log(JSON.stringify(result));
})
.catch(function(err) {
console.error(JSON.stringify(err));
});
}());
rendererではipc-promiseでsendするだけ。あとはPromiseが返ってくる。
かなり記述が簡単になったような気がする。Promiseにできればcoで扱えるのでいい感じだ。
\\\ ٩( ˘ω˘ )و ////