【问题标题】:Function pipeline in Node JS web serverNode JS Web 服务器中的函数管道
【发布时间】:2013-08-27 02:27:12
【问题描述】:

我正在开发一个函数管道,有点类似于使用 use() 的 Connect/Express 请求管道..

请求处理程序通过使用 .use() 函数添加的函数堆栈运行。异步,因为必须调用 n() 函数才能继续。

使用熟悉的 (req, res, next) 调用函数。这行得通,但它最后添加的第一个执行,我觉得很困惑,我想让它首先添加第一个执行。这适用于 last in 并继续跨管道的 r、s 引用..

(在这些示例中,我使用 r, s 而不是 req, res..)

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);

想要一些不使用循环来运行函数的东西。

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    我不知道您要复制的是什么,但 this fiddle 可以作为一个好的起点吗?

    var chain = function(fn) {
        var queue = fn ? [fn] : [], index = 0, req, res;
        var run = function(r, s) {
            req = req || r; res = res || s;
            if (index < queue.length) {
                queue[index++](req, res, run);
            }    
        };
    
        return {
            use: function(fn) {
                queue.push(fn);    
            },
            run: run
        };
    };
    
    var c = chain();
    c.use(function(r, s, n) {log(r, s, 1); n();});
    c.use(function(r, s, n) {log(r, s, 2); n();});
    c.use(function(r, s, n) {log(r, s, 3); n();});
    c.use(function(r, s, n) {log(r, s, 4); n();});
    
    c.run("req", "res");
    
    //=> req, res, 1
    //   req, res, 2
    //   req, res, 3
    //   req, res, 4
    

    如果您愿意,也可以在对chain 的初始调用中提供一个函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      • 2022-08-19
      • 2021-12-13
      • 1970-01-01
      相关资源
      最近更新 更多