0

私は、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);

関数を実行するためにループを使用しないものが欲しいです。

4

1 に答える 1