2018-07-28: eenextを公開した
やったこと
これまで
この一週間くらい日記を書いていなかった。
その間にBLEACHの実写映画を観たりした。普通に面白かったし漫画を一度読んでみたい。しかし巻数多い‥‥。
やってたことは大体記録してあるので書こうと思えば書けるのだけど面倒なのでパス。
とりあえず、これからのことを考えると胃が痛くなる感じ。coo。
eenextを公開した
https://github.com/MakeNowJust/eenext
TypeScriptでEventEmitterを実装したのでeenextという名前でNPMにpublishした。ひさしぶりにNPMに公開した気がする。NPMに公開するベストプラクティスは未だによく分からない。
このeenextの面白いところは二つある。
一つはしっかりと型が付くところ。
EventEmitterの型引数にEventsを渡しているのがポイント。
import EventEmitter from 'eenext';
interface Events {
event: string;
end: void;
}
const ee = new EventEmitter<Events>({end: 'end'});
こうするとonとかonceとかemitするときに型が付くようになる。
// こういうのはコンパイルが通る
ee.on('event', value => {
console.log(value.toUpperCase());
});
ee.emit('event', 'foo');
// こういうのはダメ
ee.on('no event', value => {
console.log(value);
});
ee.emit('no event');
あと、型がvoidなイベント名の場合はemitのときに値の部分を省略できるのもポイント。
ee.emit('end'); // これはOK
ee.emit('event'); // こっちはダメ
もう一つは、onとかonceでイベントリスナを渡すのを省略した場合にAsyncIteratorとかPromiseを返すところ。
AsyncIteratorはfor await ~ ofでループできるやつ。最近のNode.jsは対応してるので何か動く。
(async () => {
// 'emit'が発火するのを待つ
console.log(await ee.once('event');
for awit (const value of ee.on('event')) {
console.log(value);
}
})();
ee.emit('event', '1st');
ee.emit('event', '2nd');
ee.emit('event', '3rd');
ee.emit('end');
その他地味に面白いところとして、emitが非同期に実行される。こうするとイベントリスナ中でイベントを発火させてもビジーループにならないのでちょっと便利な気がする。
どうしても同期したい場合はemitがPromiseを返すのでそれをawaitすればいいはず。
ラブライブを観てる
シンデレラガールズを観たので勢いで見始めてしまった。
今度こそ最後まで観たい。