私は、Connect/Express リクエスト パイプラインと use(). に似た関数パイプラインに取り組んでいます。
要求ハンドラーは、.use() 関数を使用して追加された関数のスタックを介して実行されます。続行するには an() 関数を呼び出す必要があるため、非同期。
関数は、使い慣れた (req、res、next) を使用して呼び出されます。これは機能しますが、最後に追加されたものが最初に実行されました。これは混乱を招き、最初に追加された最初に実行されます。これは最後に機能し、パイプライン全体で r, s 参照を継続します。
(これらの例では req, res の代わりに r, s を使用しています..)
var s = {
chain: function(r, s, n){
// this runs last, was first added
s.end();
},
use: function (f){
this.chain = (function(nxt){
return function(r, s, n){
f(r, s, nxt.bind(this, r, s));
}
})(this.chain);
},
listen: function (){
this.use(function (r, s, n){
// this runs first, was last added
n();
})
var svr = require('http').createServer(this.chain);
svr.listen.apply(svr, [].slice.call(arguments)); // accept same args
}
}
s.use(function(r,s,n){...});
s.use(function(r,s,n){...});
s.listen(8080);
これがFIFOの試みです。しかし、うまくいきません。アイデア?
var chain = function(r, s, n){
console.log(1, arguments);
n();
};
function use(f){
var th = chain;
chain = (function(nxt){
return function(r, s){
th(r, s, nxt);
}
})(f);
}
use(function(r, s, n){
console.log(2, arguments)
n();
})
use(function(r, s, n){
console.log(3, arguments)
n();
})
chain(0,1);
関数を実行するためにループを使用しないものが欲しいです。