Koa.js - Máy phát điện
Một trong những tính năng mới thú vị nhất của JavaScript ES6 là một loại chức năng mới, được gọi là trình tạo. Trước trình tạo, toàn bộ tập lệnh thường được sử dụng để thực thi theo thứ tự từ trên xuống dưới, không có cách dễ dàng để dừng thực thi mã và tiếp tục lại với cùng một ngăn xếp sau đó. Trình tạo là các chức năng có thể được thoát và sau đó nhập lại. Bối cảnh của chúng (ràng buộc biến) sẽ được lưu qua các lần truy cập lại.
Trình tạo cho phép chúng tôi dừng thực thi mã ở giữa. Do đó, chúng ta hãy xem xét một máy phát điện đơn giản.
var generator_func = function* (){
yield 1;
yield 2;
};
var itr = generator_func();
console.log(itr.next());
console.log(itr.next());
console.log(itr.next());
Khi chạy đoạn mã trên, sau đây sẽ là kết quả.
{ value: 1, done: false }
{ value: 2, done: false }
{ value: undefined, done: true }
Hãy xem bên trong đoạn mã trên. Đầu tiên chúng tôi tạo một trình tạo có têngenerator_func(). Chúng tôi đã tạo một phiên bản của hàm trông kỳ lạ này và gán nó choitr. Sau đó, chúng tôi bắt đầu gọinext() trên biến itr này.
Việc gọi next () sẽ khởi động trình tạo và nó chạy cho đến khi đạt được lợi nhuận. Sau đó, nó trả về đối tượng có giá trị và thực hiện, trong đó giá trị có giá trị biểu thức. Biểu thức này có thể là bất cứ thứ gì. Tại thời điểm này, nó tạm dừng thực thi. Một lần nữa khi chúng ta gọi hàm này (tiếp theo), trình tạo tiếp tục thực hiện từ điểm năng suất cuối cùng với trạng thái hàm giống nhau tại thời điểm tạm dừng, cho đến điểm năng suất tiếp theo. Điều này được thực hiện cho đến khi không còn điểm lợi nhuận trong mã.
Máy phát điện ở Koa
Vậy tại sao chúng ta lại thảo luận về máy phát điện trong hướng dẫn này. Như bạn có thể nhớ từ chương trình hello world, chúng tôi đã sử dụngfunction* ()ký hiệu để chuyển một lệnh gọi lại đến app.use (). Koa là một đối tượng, chứa một loạt các hàm của trình tạo phần mềm trung gian, tất cả đều được tạo và thực thi theo cách giống như ngăn xếp theo từng yêu cầu. Koa cũng thực hiện hạ lưu, sau đó là ngược dòng kiểm soát.
Hãy xem ví dụ sau để hiểu điều này một cách tốt hơn.
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);
Khi chạy đoạn mã trên và điều hướng đến https://localhost:3000/ chúng tôi nhận được kết quả sau trên bảng điều khiển của chúng tôi.
1
3
5
6
4
2
Đây thực chất là cách Koa sử dụng máy phát điện. Nó cho phép chúng tôi tạo phần mềm trung gian nhỏ gọn bằng cách sử dụng thuộc tính này và viết mã cho cả các chức năng thượng nguồn và hạ lưu, do đó tiết kiệm cho chúng tôi khỏi các cuộc gọi lại.