Created
October 4, 2012 08:43
-
-
Save taichi/3832299 to your computer and use it in GitHub Desktop.
nue.jsの改善案
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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(); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
将来案1と将来案2を対応しました。
(npmにもバージョン0.7.0devとして登録してあります。)
それ以外の案は採用していません。理由は、asyncの呼び出しとその結果のオブジェクトの関係性は1:1に限定したいからです(場合によって1:1だったり1:nだったりとするとわかりにくいので)。
CoffeeScriptみたいなDestructuring Assignmentが使えれば便利だけどねー。(1:1の関係性を保ちながら引数を展開できる)。