2013-08-23 72 views
0

我工作的一個功能管線有點類似於連接與使用/快遞請求管道()..功能管線

請求處理程序通過使用添加的功能堆棧上運行.use()函數。異步,因爲必須調用n()函數才能繼續。

使用熟悉的(req,res,next)調用函數。這是有效的,但是它最後添加的第一個被執行,這讓我感到困惑,我想先添加第一個執行。這適用於最後在和整個管道繼續R,S引用..

(我用R,S,而不是REQ,資源在這些例子..)

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

想要的東西,不使用循環運行通過功能。

回答

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時提供函數。