Koa.js - 生成器



JavaScript ES6 最令人興奮的新特性之一是新型函式——生成器。在生成器出現之前,整個指令碼通常按照自上而下的順序執行,沒有簡單的方法來停止程式碼執行並在稍後使用相同的堆疊恢復執行。生成器是可以退出並在以後重新進入的函式。它們的上下文(變數繫結)將在重新進入時儲存。

生成器允許我們在中途停止程式碼執行。因此,讓我們來看一個簡單的生成器。

var generator_func = function* (){
   yield 1;
   yield 2;
};

var itr = generator_func();
console.log(itr.next());
console.log(itr.next());
console.log(itr.next());

執行以上程式碼後,結果如下。

{ value: 1, done: false }
{ value: 2, done: false }
{ value: undefined, done: true }

讓我們看看上面的程式碼。我們首先建立一個名為generator_func()的生成器。我們建立了這個奇怪函式的例項並將其賦值給itr。然後我們開始在這個itr變數上呼叫next()

呼叫next()啟動生成器,它執行直到遇到yield。然後它返回一個包含value和done的物件,其中value具有表示式的值。這個表示式可以是任何東西。此時,它暫停執行。當我們再次呼叫此函式(next)時,生成器從上次yield點恢復執行,函式狀態與暫停時的狀態相同,直到下一個yield點。這將持續到程式碼中沒有更多yield點為止。

Koa中的生成器

為什麼我們在本教程中討論生成器?您可能還記得在hello world程式中,我們使用function* ()表示法將回調傳遞給app.use()。Koa是一個物件,它包含一箇中間件生成器函式陣列,所有這些函式都在每次請求時以堆疊式方式組合和執行。Koa還實現了控制流的下游和上游。

請看下面的例子,以便更好地理解這一點。

var koa = require('koa');
var app = koa();
 
app.use(function* (next) {
   //do something before yielding to next generator function 
   
   //in line which will be 1st event in downstream
   console.log("1");
   yield next;
 
   //do something when the execution returns upstream, 
   //this will be last event in upstream
   console.log("2");
});
app.use(function* (next) {
   // This shall be 2nd event downstream
   console.log("3");
   yield next;
 
   // This would be 2nd event upstream
   console.log("4");
});
app.use(function* () { 
   // Here it would be last function downstream
   console.log("5");
   
   // Set response body
   this.body = "Hello Generators";

   // First event of upstream (from the last to first)
   console.log("6");
});

app.listen(3000);

執行以上程式碼並導航到https://:3000/,我們在控制檯中得到以下輸出。

1
3
5
6
4
2

這基本上就是Koa如何使用生成器。它允許我們利用此特性建立緊湊的中介軟體,併為上游和下游功能編寫程式碼,從而使我們免於回撥。

廣告
© . All rights reserved.