Flow.js version 2.0.0 では以下の変更を行っています。
- 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(reason:String = "exit") になり、中断理由を設定する文字列が指定可能になりました。
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();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();
}
});
}
}