latest log

酩酊状態で書いたエンジニアポエムです。酩酊状態で読んでください。

非同期プログラミングを驚きのシンプルさに (するかもしれない) Flow.js を公開しました。

(ε・◇・)з o O (
 (ミ・◇・ミ) o O ( あたし。ずっと思ってた…
 (ミ・◇・ミ) o O ( あたしの脳みそだと Deferred/Promises は、ちょっと難しすぎるって…
 (ミ・◇・ミ) o O ( jQuery.Deferred 解説記事をいくつかみたけど、すごく… モジモジしてて、ちょっと縦長すぎるんですもの…
 (ミ・◇・ミ) o O ( だから作っちゃった…
).done();



非同期処理をシンプルに書ける、とても小さなライブラリをリリースしました。
Deferred/Promises は既存の構造や, そもそもの考え方を大きく改変する必要がありますが、
flow.js はあまり大きな違和感もなく、現在の流れを維持したまま導入できると思います。

使い方はこちらをごらんください
http://www.slideshare.net/uupaa/flowjs

リポジトリはこちらです
https://github.com/uupaa/flow.js

$ npm install flow_js でもインストールできます


実は、3年ほど前に実装したコードをとあるプロジェクトで使っておりまして、
「この非同期処理のコードよくわからないから、分かるようにしてよ」と言われたのがきっかけです。
せっかくなので、より多くの人にシェアできる形でリリースしましょうとなりました。

そんな訳なので、Deferredの実装に対抗して急に作ったわけでもなく、基本的には枯れている実装だったりします。


コールバックの拡張とダックタイピング

以下のようにコールバックをうけとる関数を、Flowのインスタンスも受け取るように改造すると、中々便利だったりします。
instanceof はちょっと遅いので、大抵のケースでは fn.pass ? fn.pass() でも良いでしょう。

function hoge(fn) { // @arg Function:
    fn();
}
function hoge(fn) { // @arg Function/Flow:
    fn.pass ? fn.pass()
            : fn();
}
function hoge(fn) { // @arg Function/Flow:
    fn instanceof Flow ? fn.pass()
                       : fn();
}