1. 程式人生 > >koa框架中對next()的理解

koa框架中對next()的理解

const one = (ctx, next) => {
  console.log('>> one');
  next();
  console.log('<< one');
}

const two = (ctx, next) => {
  console.log('>> two');
  next();
  console.log('<< two');
}

const three = (ctx, next) => {
  console.log('>> three');
  next();
  console.log('<< three');
}

app.use(one);
app.use(two);
app.use(three);

輸出結果:
>> one
>> two
>> three
<< three
<< two
<< one

Next的作用

我們在定義express中介軟體函式的時候都會將第三個引數定義為next,這個next函式主要負責將控制權交給下一個中介軟體,如果當前中介軟體沒有終結請求,並且next沒有被呼叫,那麼當前中介軟體的請求將被掛起,等到next()後的中介軟體執行完再返回繼續執行。總結來說,就是:

從第一個中介軟體開始執行,遇到next進入下一個中介軟體,一直執行到最後一箇中間件,在逆序,執行上一個中介軟體next之後的程式碼,一直到第一個中介軟體執行結束才發出響應。如下程式碼

one = (ctx, next) => {
  console.log('>> one');
   next();----------------> two = (ctx, next) => {
                              console.log('>> two');
                              next();------------------> three = (ctx, next) => {
                                                           console.log('>> three');
                                                           next();--------------------|
//沒有下一層,所以不再跳往下一層,直接執行當前層的下一步
                                                           console.log('<< three');<--| 
                                                         }
                              console.log('<< two');
                            }

  console.log('<< one'); 
}  

Koa 的最大特色,就是中介軟體(middleware)Koa 應用程式是一個包含一組中介軟體函式的物件,它是按照類似堆疊的方式組織和執行的。Koa中使用app.use()用來載入中介軟體,基本上Koa 所有的功能都是通過中介軟體實現的。

每個中介軟體預設接受兩個引數,第一個引數是 Context 物件,第二個引數是next函式。只要呼叫next函式,就可以把執行權轉交給下一個中介軟體。每一箇中間件就相當於洋蔥的一層,請求從最外層進去,然後從最裡層出來,每個中介軟體都會執行兩次。three已經是最裡層的中介軟體了,所以next()只是執行next後的程式碼,然後一層一層返回

下圖為經典的Koa洋蔥模型

koa2æ´è±æ¨¡å