中間部品の実現原理

2593 ワード

expressを使ったことがある学生はすべて知っていて、一つのHTTPの要求の完成はいくつかの中間部品を経て完成しました.中間部品はアクセス可能な要求対象(req)と応答対象(res)の関数です.Expressアプリケーションの要求-応答サイクルでは、次のインラインの中間部品は通常変数を使います.  next 表示する
       じゃ、まず面接で出会った問題に行きます.中間件の実現構想です.もちろん、あなたがexpressを知っているなら、もっとよく理解してくれます.
       
     function fun1(ctx, next) {
         ctx.count++;
         console.log(ctx.count);
         next();
     }
     function fun2(ctx, next) {
         ctx.count++;
         console.log(ctx.count);
         next();
     }
     function  fun3(ctx, next) {
         ctx.count++;
         console.log(ctx.count);
         next();
     }
     compose([fun1, fun2, fun3])({count: 1});
      
           compose,  compose([fun1, fun2, fun3])({count: 1})   ,  fun1 fun2 fun3    ,   fun1   
next    ,                ,fun1         fun2     ,{count:1}    context,       
   context      。
     私のcomposeは構想が簡単です.次の通りです.
 function compose(arr){
         index = 0;
         len = arr.length;
         return function (ctx) {
             function next() {
                 index++;
                 if(index >= len) return;
                 arr[index](ctx, next);
             }
             arr[index](ctx, next);
         }
     }
このように出力した結果は2 3 4で、予想通りです.
次はこの解法を検証しましょう.
テスト一:ある中間関数体で、ユーザーがnextを呼び出していないと、次の中間部品関数を呼び出さない.
function fun1(ctx, next) {
         ctx.count++;
         console.log(ctx.count);
         next();
     }
     function fun2(ctx, next) {
         ctx.count++;
         console.log(ctx.count);
//         next();           
     }
     function  fun3(ctx, next) {
         ctx.count++;
         console.log(ctx.count);
         next();
     }
     compose([fun1, fun2, fun3])({count: 1});
は、上述のようにfun 2でnextを呼び出す必要がない場合、出力は2 3となり、予想通りとなる.
試験二:nextの呼び出しが非同期環境にある場合、次の中間部品関数は前の中間部品関数のnextが本当に呼び出された時に実行されます.
function fun1(ctx, next) {
         ctx.count++;
         console.log(ctx.count);
         next();
     }
     function fun2(ctx, next) {
         ctx.count++;
         console.log(ctx.count);
         setTimeout(function () {
             next();
         },1000);
     }
     function  fun3(ctx, next) {
         ctx.count++;
         console.log(ctx.count);
         next();
     }
     compose([fun1, fun2, fun3])({count: 1});
は上述のように、fun 2の中で1 s後にnextを呼び出して、2 3に出力してから1秒後に4を出力します.
もちろんこれは一番簡単な中間部品の構想です.expressの中間部品の中ではこれよりずっと複雑ですが、問題を解決する考えを考察してもいいです.