Skip to content

Instantly share code, notes, and snippets.

@taichi
Created October 4, 2012 08:43
Show Gist options
  • Save taichi/3832299 to your computer and use it in GitHub Desktop.
Save taichi/3832299 to your computer and use it in GitHub Desktop.
nue.jsの改善案
// async の引数が無い場合、全部が次に渡される様にして欲しい。
// コールバック関数の引数が3つ以上の場合、次のステップには配列が入ってきてよい。
// 目的
// コールバック関数の引数がerrのみ、もしくは二つの場合、
// つまりas(1)で事足りるケースをnueに特別扱いして貰って楽に記述したい。
// nodeのcallbackを取る関数は殆どがそうなっている。
// 現状1
flow(function start(file1, file2) {
fs.readFile(file1, 'utf8', this.async(as(1)));
fs.readFile(file2, 'utf8', this.async(as(1)));
}, function(txt1, txt2) {
console.log(txt1, txt2);
this.next();
}, function end() {
if (this.err) { throw this.err; }
this.next();
})('path/tofile1', 'path/to/file2');
// 将来案1
flow(function start(file1, file2) {
fs.readFile(file1, 'utf8', this.async());
fs.readFile(file2, 'utf8', this.async());
}, function(txt1, txt2) {
console.log(txt1, txt2);
this.next();
}, function end() {
if (this.err) { throw this.err; }
console.log('ok');
this.next();
})('path/tofile1', 'path/to/file2');
// コールバックにエラー以外にも複数の値が引き渡される関数、こんな感じ。
function manyArgsCaller(p, cb) {
var err = new Error();
cb(err, p, 1, 2, 3);
}
// 現状2
flow(function start(p1, p2) {
manyArgsCaller(p1, this.async({
p0 : as(1),
p1 : as(2),
p2 : as(3)
}));
manyArgsCaller(p1, this.async({
p0 : as(1),
p1 : as(2),
p2 : as(3)
}));
}, function end(first, second) {
if (this.err) { throw this.err; }
console.log(first.p0, first.p1, first.p2);
console.log(second.p0, second.p1, second.p2);
this.next();
})('param1', 'param2');
// 将来案2
flow(function start(p1, p2) {
manyArgsCaller(p1, this.async());
manyArgsCaller(p1, this.async());
}, function end(first, second) {
if (this.err) { throw this.err; }
console.log(first[0], first[1], first[2]);
console.log(second[0], second[1], second[2]);
console.log('ok');
this.next();
})('param1', 'param2');
// asyncを1引数の関数では無く、n引数の関数にして欲しい。
// 目的
// flowの起動から、最後まで引き渡され続ける様なパラメータがある時に、
// スコープを限定しつつも楽にパラメータを引き継ぎたい。
// 現状
flow(function start(one, two, three) {
fs.readFile(one, 'utf8', this.async({
txt : as(1),
t1 : two,
t2 : three
}));
}, function(param) {
console.log(param.txt);
console.log(param.t1, param.t2);
this.next();
}, function end() {
if (this.err) { throw this.err; }
console.log('ok');
this.next();
});
// 将来案
flow(function start(one, two, three) {
fs.readFile(one, 'utf8', this.async(as(1), two, three));
}, function(txt, two, three) {
console.log(txt);
console.log(two, three);
this.next();
}, function end() {
if (this.err) { throw this.err; }
console.log('ok');
this.next();
});
// n引数にしつつ複数のコールバック引数を取る時の振る舞い
// 現状
flow(function start() {
child_process.exec('whoami', this.async({
out : as(1),
err : as(2)
}));
}, function end(std) {
if (this.err) { throw this.err; }
console.log('stdout: ' + std.out);
console.log('stderr: ' + std.err);
console.log('ok');
this.next();
});
// 将来案
flow(function start() {
child_process.exec('whoami', this.async(as(1), as(2)));
}, function end(stdout, stderr) {
if (this.err) { throw this.err; }
console.log('stdout: ' + stdout);
console.log('stderr: ' + stderr);
console.log('ok');
this.next();
});
@nakamura-to
Copy link

将来案1と将来案2を対応しました。
(npmにもバージョン0.7.0devとして登録してあります。)

それ以外の案は採用していません。理由は、asyncの呼び出しとその結果のオブジェクトの関係性は1:1に限定したいからです(場合によって1:1だったり1:nだったりとするとわかりにくいので)。

CoffeeScriptみたいなDestructuring Assignmentが使えれば便利だけどねー。(1:1の関係性を保ちながら引数を展開できる)。

flow(
  () ->
    child_process.exec('whoami', this.async(as(1), as(2)))
  ([stdout, stderr]) ->
    if this.err then throw this.err
    console.log('stdout: ' + stdout)
    console.log('stderr: ' + stderr)
    console.log('ok')
)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment