Skip to content

Instantly share code, notes, and snippets.

@uupaa
Last active December 21, 2015 06:09
Show Gist options
  • Select an option

  • Save uupaa/6261891 to your computer and use it in GitHub Desktop.

Select an option

Save uupaa/6261891 to your computer and use it in GitHub Desktop.
Flow.js version 2.0.0 beta

Flow.js version 2.0.0 beta

Flow.js version 2.0.0 では以下の変更を行っています。

  • Flow#xhr を追加

Flow#xhr を追加

XHR Level 2 の機能をより使いやすくするヘルパーメソッド Flow#xhr を追加しました

function xhr(event, // @arg Event/Error:
             key) { // @arg String(= ""): args key (optional)
                    // @ret this:
                    // @desc: pass or miss wrapper, for XHR Lv2
    if (event instanceof Error) {
        return this.miss(event, key);
    }
    return this.pass(event.target.responseType ? event.target.responsText
                                               : event.target.response, key);
}

XHR Level 2 で追加された XMLHttpRequest#onload, #onerror と一緒に、以下のように使用します。

// 2つのファイル(hoge, piyo)をパラレルに読み込み、読み込み終了でそれらの内容を表示する
var flow = new Flow(2, function(err, args) {
        if (err) { ... }
        console.log(args.hoge); // hoge.txt
        console.log(args.piyo); // piyo.txt
        console.log(args[0]);   // 先に読み込まれたファイル(hoge.txt または piyo.txt)
        console.log(args[1]);   // 後から読み込まれたファイル(hoge.txt または piyo.txt)
    });

get("hoge.js", flow, "hoge");
get("piyo.js", flow, "piyo");

function get(url, flow, name) {
    var xhr = new XMLHttpRequest();
    xhr.onload = xhr.onerror = function(event) { // @arg Event/Error:
        flow.xhr(event, name); // flow#xhr に event オブジェクトを渡す
    };
    xhr.open("GET", url, true);
    xhr.send();
}

Flow#exit に引数を追加

Flow#exit() が Flow#exit(reason:String = "exit") になり、中断理由を設定する文字列が指定可能になりました。

Flow#reason を追加

Flow#exit() や Flow#miss() の失敗理由を設定する Flow#reason() を追加しました。
Flow#reason("エラー理由") とすると、callback( new Error("エラー理由") ) のようにエラーオブジェクトの生成に使われます。

// Flow#exit()
var flow = new Flow(1, function(err, args) {
    console.log(err.message); // "ユーザによる処理の中断" 
});
flow.exit("ユーザによる処理の中断");

// ----------------------------------------
// Flow#miss()
var flow = new Flow(1, function(err, args) {
    console.log(err.message); // "ユーザによる処理の中断" 
});
flow.reason("ユーザによる処理の中断").miss();

Allow 追加

Flow は複数の非同期処理を待機する仕組みであり、処理を順番に待機する仕組みは提供していませんでした。
Version 2.0.0 から、この直線的な処理を待機する仕組みとして Allow (弓矢) を追加しました。

Allow はコンストラクタで複数の関数を順番にならべ、new Allow(fn..., callback) の形で使用します。

new Allow(fn1, fn2, fn3, callback) の場合は、fn1 → fn2 → fn3 の順番で処理を行い、fn3 の終了で callback(err, args) を呼びます。

function Allow(var_args) { // @var_args Function/Flow: new Allow(fn..., callback)
    var args = Array.apply(null, arguments);
    var callback = args.pop();
    var flow = new Flow(args.length, callback);
    tick();

    function tick() {
        var fn = args.shift();

        fn && fn(function(err, value, key) {
            if (err) {
                flow.reason(err.message);
                flow.miss(value, key);
            } else {
                flow.pass(value, key);
                tick();
            }
        });
    }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment