EventEmitterをPromiseで制御する
Electronをいじってみているのだけど、 rendererではどうにもできない処理をremoteモジュール経由でmainに処理させようとしたら、 エラーが出力されたりして思った通りに動作してくれない。 (remoteモジュールをちゃんと理解していないので使い方を間違えている可能性は大いにある)
仕方ないのでmainに処理を書いてrendererからipcモジュールを使ってやり取りをするように書いたら、 今度はEventEmitter的になるので読んでいて処理が追いにくい。 なんとかPromiseに書き直せないかなーと試しに書いたコードがこちら。
'use strict';
var EventEmitter = require('events').EventEmitter,
event = new EventEmitter();
event.on('emit', function() {
event.emit.apply(
event,
['result'].concat(Array.prototype.slice.call(arguments)));
});
var a = [1, 2, 3];
Promise
.all(a.map(function(value) {
return new Promise(function(resolve, reject) {
var callback;
event.on('result', callback = function(result) {
// idを判別
if (value !== result) {
return;
}
event.removeListener('result', callback);
resolve({ id: result });
});
// テキトーに時間差をつける
setTimeout(function() {
// idを一緒に渡す
event.emit('emit', value);
}, 100 * (Math.random() * 10) >> 0);
});
}))
.then(console.log.bind(console))
.catch(console.error.bind(console));
$ iojs index.js
[ { id: 1 }, { id: 2 }, { id: 3 } ]
もうちょっとスマートに書けないのかなー。