Generator Là Gì
ES 6 trình làng một phương thức hoàn toàn mới cho phép chúng ta làm câu hỏi với function cùng iterator là Generator (hay hàm sinh). Generator là function có thể thể dừng giữa chừng và tiếp đến tiếp tục từ nơi mà nó vẫn dừng. Nói một biện pháp ngắn gọn gàng thì generators nó là iterator đội vết function =))
Fun fact: async/await được xây dựng dựa vào generators.
Bạn đang xem: Generator là gì
Generators có mối contact mật thiết cùng với iterators. Nếu chúng ta chưa biết về iterator thì các bạn có thể xem nhanh bài viết này nhé

Sau đấy là một ví dụ đính với đời sống rất có thể giúp cho các bạn hiểu về bản chất của generator bởi trực giác =)):
Hãy tưởng tượng bạn đang mải coi JAV (Japanese Animal Video) đang tới doạn một bé đang thịt con còn sót lại thì bao gồm thằng shipper gọi các bạn ra dấn hàng. Mặc dù đang không nhỏ trào (phim nhé =))) nhưng bạn vẫn bắt buộc pause phim lại để ra đem hàng, sau khoản thời gian lấy hàng kết thúc thì bạn lại bật phim xem tiếp chứ không xem lại trường đoản cú đầu. Hành động xem tiếp đó của bạn nó cũng như là generator vậy.
Giới thiệu
Hãy cùng xem liệu generator rất có thể giúp chúng ta giải quyết đều vấn đề thông thường trong lập trình như nào nhé. Nhưng mà trước đó bọn họ hãy cùng định nghĩa generators là gì.
Generators là gì
Một function thông thường như dưới đây không thể làm sao bị ngừng được trước lúc mà nó kết thúc quá trình của nó (dòng lệnh cuối được thực thi)
function normalFunc() console.log("I") console.log("cannot") console.log("be") console.log("stopped.")Cách tuyệt nhất để bạn có thể exit hàm normalFunc là return khỏi nó, hoặc là throw một lỗi như thế nào đó. Nếu bọn họ gọi function này lại thì nó sẽ bắt đầu được thực thi từ câu lệnh đàu tiên của hàm.
Ngược lại thì generator là hàm có thể dừng thân chừng và liên tục từ nơi mà nó dừng/
Sau đây là một số định nghĩa thông dụng về generator"
Generator là 1 trong những lớp quan trọng đặc biệt của function có tác dụng đơn giản hóa việc implement một iterator.Generator là một trong những hàm sinh ra các các hiệu quả tuần trường đoản cú thay vì là chỉ trả về một giá bán trị 1-1 lẻ.Trong JavaScript thì generator là 1 hàm đã trả về một object mà bạn có thể gọi next() bên trên nó. Từng lần chúng ta gọi next() nó đã trả về một object bao gồm dạng sau:
value: Any, done: true thuộc tính value sẽ chứa giá trị trả về. Còn done đã hoặc là false hoặc true. Lúc done là true thì generator sẽ tạm dừng và sẽ không sinh ra giá trị nào nữa.
Dưới đó là hình minh họa:

yield ở chỗ này có công dụng tương trường đoản cú như return ở vị trí nó "trả về" giá trị được có mang sau nó. Điểm khác của nó là tại đoạn nó giữ gìn trạng thái của hàm tại địa chỉ yield được gọi nhằm mục đích mục đích làm việc lần điện thoại tư vấn next() tiếp theo của bọn họ nó hoàn toàn có thể chạy tiếp từ địa điểm nó đang chạy dở. Đó là tại sao keyword yield ra đời, bọn họ sẽ nói là hàm x yield một quý hiếm chứ không phải là return
Tạo một Generator
Sau đó là ví dụ để chế tạo ra một generator vào Javascript:
function * generatorFunction() // Line 1 console.log("This will be executed first."); yield "Hello, "; // Line 2 console.log("I will be printed after the pause"); yield "World!";const generatorObject = generatorFunction(); // Line 3console.log(generatorObject.next().value); // Line 4console.log(generatorObject.next().value); // Line 5console.log(generatorObject.next().value); // Line 6// This will be executed first.// Hello, // I will be printed after the pause// World!// undefinedChúng ta thực hiện cú pháp function * thay vì chưng function nhằm khai báo một generator. Vị nó cũng chỉ là function nên bạn cũng có thể sử dụng ở ngẫu nhiên đâu như đối với function thông thường.
Ngoài ra thì chúng ta có thể return từ bỏ generator. Tuy nhiên thì khi hotline return sẽ thiết lập giá trị đến done thành true - bởi vậy là generator sẽ không thể hình thành thêm quý hiếm nào nữa:
Ở mẫu thứ 3, họ đang tạo ra một object generator. Nếu các bạn đang hoảng sợ vì thấy nó y như đang call hàm thì các bạn yên trọng tâm là chúng ta đang đúng nhé =)): khi chúng ta gọi hàm generator thì mẫu mà nó trả về là một trong object generator. Object generator này là một trong những iterator nên bạn cũng có thể sử dụng nó trong khoảng lặp for-of hoặc trong các fucntion khác đồng ý đối số truyền vào là iterable.
Xem thêm: Giới Thiệu Phố Cổ Hội An Bằng Tiếng Anh, Giới Thiệu Về Phố Cổ Hội An Bằng Tiếng Anh
Ở mẫu 4 thì chúng ta gọi hàm next() trên generatorObject. Với lời điện thoại tư vấn này thì generator bắt đầu được thực thi tác dụng của nó. Đầu tiên thì nó console.log chiếc This will be executed first. Sau đó thì lúc nó chạy hết dòng yield "Hello, thì generator đã yield ra một object bao gồm nội dung như sau: value: "Hello, ", done: false cùng tạm dừng.
Ở chiếc thứ 5 thì chúng ta lại gọi next(). Lần này thì generator đã lại chạy tiếp bước đầu từ chỗ nó đã dừng. Đầu tiên nó đang console.log xâu I will be printed after the pause. Một lần tiếp nữa nó lại gặp mặt yield, objext được yield tất cả nội dung là value: "World!", done: false . Họ sẽ chỉ extract ở trong tính value để in nó. Generator lại liên tiếp bị tạm bợ dừng.
Ở mẫu thứ 6 thì bọn họ lại hotline next(). Lần này thì không còn string nào để in ra được nữa. Vào trường phù hợp này thì generators sẽ return một object là value: undefined, done: true thay vị yield. Quý giá của cờ done được phối thành true ,
Trong trường họp chúng ta muốn chạy lại generator từ trên đầu thì sẽ phải tạo lập một generator mới.
Khi làm sao thì thực hiện Generator
Có không ít tình huống thiết thật mà chúng ta sẽ thừa kế lợi từ việc sử dụng generator. Bọn họ hãy cùng xem nhé.
Implement một iterablesBình thường khi chúng ta implement một iterator thì chúng ta sẽ phải tự tạo nên một object iterator bằng tay thủ công với function next(). Ngoài ra thì state của nó chúng ta cũng đề nghị lưu thủ công. Vày generators cũng chính là iterables đề nghị chúng cũng có thể được dùng để implement một iterables một giải pháp ngắn gọn cùng dễ đọc hơn. Hãy thuộc xem một ví dụ như nhé:
Đặt vấn đề: Implement một iterable trả về This, is, với iterable. Đoạn code bên dưới sẽ áp dụng iterator nhằm implement một iterable:
const iterableObj =
function * iterableObj() yield "This"; yield "is"; yield "iterable."for (const val of iterableObj()) console.log(val);// This// is // iterable.So sánh thân 2 phiên phiên bản ở trên thì bạn cũng có thể thấy phiên phiên bản sử dụng generator vượt trội hơn nhiều do:
Chúng ta chưa phải implement function next()Chúng ta không hẳn soạn ngôn từ object trả về một cách thủ công, ví dụ như ở trên là value: "This", done: false Chúng ta ko phải suy xét state của function. Như sinh hoạt trong lấy một ví dụ với iterator họ phải khởi tạo biến hóa step nhằm lưu state. Vươn lên là state này sẽ đưa ra quyết định output từ bỏ iterable. Cùng với generator thì bọn họ không phải suy xét vấn đề này.Tạo luồng tài liệu vô tậnChúng ta rất có thể tạo ra một generator với năng lực sinh tài liệu vô tận, ví dụ:
function * naturalNumbers() let num = 1; while (true) yield num; num = num + 1 const numbers = naturalNumbers();console.log(numbers.next().value)console.log(numbers.next().value)// 1// 2Có thể sử dụng Generator như một observerChúng ta hoàn toàn có thể dùng hàm next(val) nhằm gửi kèm tài liệu đến mang lại generator. Mà mỗi lần bọn họ gọi giữ hộ value đến cho generator như vậy là họ đang "đánh thức" generator dậy. Cũng chính vì vậy nên bạn có thể coi generator như là một observer vì nó luôn luôn quan gần cạnh value được truyền vào và sẽ sở hữu hành vi rõ ràng kèm theo tương ứng.
Ưu điểm của Generators
Lazy evaluation
Như trong ví dụ luồng tài liệu vô tận thì chúng ta cũng có thể làm được vì vậy là dựa vào lazy evaluation. Lazy evaluation là một trong mô hình đo lường và tính toán sẽ trì hoãn việc thống kê giám sát của một biểu thức cho đến lúc nào chúng ta cần. Bởi vậy nghĩa là nếu họ không cần đến nó thì nó sẽ không được tính toán. Hãy xem ví dụ như sau nhé:
function * powerSeries(number, power) let base = number; while(true) yield Math.pow(base, power); base++; Khi bọn họ gọi powersOf2 = powerSeries(3, 2); thì bọn họ mới chỉ đối chọi thuần là tạo thành một object generator, chưa có giá trị nào được xem toán. Sau đó, nếu bọn họ gọi tiếp next() thì nó sẽ đo lường và thống kê ra quý giá 9 cùng trả về kết quả.
Sử dụng buổi tối ưu cỗ nhớ
Một hệ quả của Lazy Evaluation là bộ lưu trữ sẽ được generator sử dụng một bí quyết tối ưu. Do họ sẽ chỉ sinh ra các values mà họ cần. Với các function thông thường thì bọn họ sẽ đề xuất sinh ra trước những values cùng giữ chúng để hoàn toàn có thể dùng về sau. Tuy vậy thì cùng với generator thì bạn cũng có thể trì hoãn sự tính toán này lại cho đến khi họ thực sự phải value trả về của nó.
Xem thêm: Kinh Nghiệm Du Lịch Seoul Tự Túc 2018, Kinh Nghiệm Du Lịch Seoul
Kết
Hi vọng qua bài viết này các bạn đã sở hữu cái nhìn cụ thể hơn về Generators. Hẹn gặp gỡ lại các bạn trong các nội dung bài viết sau.
Happy coding ~