Generator là gì

ES 6 giới thiệu một cách thức hoàn toàn new cho phép bọn họ thao tác cùng với function cùng iterator là Generator (tuyệt hàm sinh). Generator là function hoàn toàn có thể thể giới hạn thân chừng với sau đó tiếp tục tự khu vực nhưng nó vẫn dừng. Nói một giải pháp nlắp gọn thì generators nó là iterator nhóm dấu function =))

Fun fact: async/await được xây dựng dựa trên generators.

Bạn đang xem: Generator là gì

Generators bao gồm mọt tương tác trực tiếp cùng với iterators. Nếu các bạn chưa chắc chắn về iterator thì các bạn cũng có thể coi nhanh nội dung bài viết này nhé

*

yield tại đây có tác dụng tương tự như return ở vị trí nó "trả về" quý giá được có mang sau nó. Điểm không giống của nó là ở vị trí nó lưu giữ tâm trạng của hàm trên vị trí yield được điện thoại tư vấn nhằm mục đích sinh hoạt lần Điện thoại tư vấn next() tiếp theo của chúng ta nó hoàn toàn có thể chạy tiếp trường đoản cú chỗ nó đang làm việc dlàm việc. Đó là nguyên nhân từ khóa yield Thành lập và hoạt động, họ đang nói là hàm x yield một quý giá chđọng chưa hẳn 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 sử dụng cú pháp function * núm bởi function để knhì báo một generator. Do nó cũng chỉ là function bắt buộc bạn có thể áp dụng sống bất kỳ đâu nlỗi đối với function thông thường.

Trong khi thì chúng ta cũng có thể return tự generator. Tuy nhiên thì Lúc điện thoại tư vấn return vẫn tùy chỉnh thiết lập giá trị cho done thành true - những điều đó là generator sẽ không thể xuất hiện thêm quý hiếm nào nữa:

Tại cái vật dụng 3, bọn họ đã tạo nên một object generator. Nếu các bạn đang hoảng loạn do thấy nó hệt như sẽ Call hàm thì các bạn yên trung khu là chúng ta đã đúng nhé =)): Khi bọn họ Điện thoại tư vấn hàm generator thì mẫu mà nó trả về là 1 trong object generator. Object generator này là 1 iterator cầ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.

Ở dòng 4 thì bọn họ call hàm next() bên trên generatorObject. Với lời Gọi này thì generator bước đầu được xúc tiến công dụng của chính nó. Thứ nhất thì nó console.log loại This will be executed first. Sau đó thì lúc nó chạy không còn cái yield "Hello, thì generator vẫn yield ra một object có câu chữ như sau: value: "Hello, ", done: false và tạm ngưng.

Tại chiếc sản phẩm 5 thì chúng ta lại Call next(). Lần này thì generator đang lại chạy tiếp ban đầu tự vị trí nó vẫn ngừng. trước hết nó đã console.log xâu I will be printed after the pause. Một đợt nữa này lại gặp mặt yield, objext được yield bao gồm văn bản là value: "World!", done: false . Chúng ta đang chỉ extract trực thuộc tính value nhằm in nó. Generator lại thường xuyên bị tạm dừng.

Tại mẫu sản phẩm 6 thì họ lại gọi next(). Lần này thì không còn string làm sao để in ra được nữa. Trong ngôi trường vừa lòng này thì generators đang return một object là value: undefined, done: true cố kỉnh vì yield. Giá trị của cờ done được phối thành true ,

Trong trường họp chúng ta ao ước chạy lại generator từ đầu thì đã phải lập một generator mới.

Xem thêm: Game Original Steam Doraemon Story Of Seasons Pc, Spesifikasi Pc Untuk Doraemon: Story Of Seasons

lúc nào thì sử dụng Generator

Có không hề ít trường hợp thực tế mà lại họ sẽ tiến hành thụ hưởng từ những việc sử dụng generator. Chúng ta hãy hãy cùng xem nhé.

Implement một iterables

Bình hay lúc họ implement một iterator thì bọn họ sẽ yêu cầu tự chế tạo ra một object iterator thủ công với function next(). Hình như thì state của nó chúng ta cũng buộc phải lưu bằng tay. Do generators cũng chính là iterables bắt buộc bọn chúng cũng rất có thể được dùng để làm implement một iterables một phương pháp ngắn thêm gọn với dễ nhìn đọc rộng. Hãy cùng coi một ví dụ nhé:

Đặt vấn đề: Implement một iterable trả về This, is, cùng iterable. Đoạn code dưới đang sử dụng iterator nhằm implement một iterable:

const iterableObj = () let step = 0; return next() step++; if (step === 1) return value: "This", done: false; else if (step === 2) return value: "is", done: false; else if (step === 3) return value: "iterable.", done: false; return value: "", done: true ; ,for (const val of iterableObj) console.log(val);// This// is // iterable.Và đó là đoạn code áp dụng generator:

function * iterableObj() yield "This"; yield "is"; yield "iterable."for (const val of iterableObj()) console.log(val);// This// is // iterable.So sánh giữa 2 phiên bạn dạng ngơi nghỉ bên trên thì chúng ta cũng có thể thấy phiên bản áp dụng generator vượt trội hơn hẳn do:

Chúng ta không phải implement function next()Chúng ta không phải soạn nội dung object trả về một bí quyết thủ công bằng tay, ví dụ như sinh sống bên trên là value: "This", done: false Chúng ta không hẳn quan tâm đến state của function. Nhỏng ngơi nghỉ trong ví dụ cùng với iterator chúng ta phải lập vươn lên là step nhằm lưu lại state. Biến state này đã quyết định output trường đoản cú iterable. Với generator thì họ chưa hẳn quyên tâm đến sự việc này.Tạo luồng dữ liệu vô tận

Chúng ta có thể tạo nên một generator với kĩ năng sinch tài liệu rất nhiều, 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 có thể dùng hàm next(val) nhằm gửi kèm tài liệu mang lại mang lại generator. Mà những lần họ Hotline gửi value mang đến mang đến generator như thế là chúng ta đang "tấn công thức" generator dậy. Chính do vậy đề xuất chúng ta có thể coi generator nhỏng là một obVPS do nó luôn quan lại cạnh bên value được truyền vào cùng sẽ có được hành động cụ thể hẳn nhiên tương xứng.

Ưu điểm của Generators

Lazy evaluation

Nhỏng trong ví dụ luồng tài liệu rất nhiều thì chúng ta cũng có thể có tác dụng được những điều đó là nhờ vào lazy evaluation. Lazy evaluation là 1 trong quy mô tính toán đã trì hoãn bài toán tính toán thù của một biểu thức cho tới bao giờ chúng ta buộc phải. Vậy nên tức thị trường hợp chúng ta không bắt buộc mang đến nó thì nó sẽ không còn được xem toán thù. Hãy coi ví dụ sau nhé:

function * powerSeries(number, power) let base = number; while(true) yield Math.pow(base, power); base++; lúc họ hotline powersOf2 = powerSeries(3, 2); thì chúng ta bắt đầu chỉ đối chọi thuần là tạo nên một object generator, chưa có quý giá làm sao được tính toán. Sau kia, nếu như bọn họ gọi tiếp next() thì nó sẽ tính tân oán ra quý giá 9 và trả về công dụng.

Sử dụng tối ưu cỗ nhớ

Một hệ quả của Lazy Evaluation là bộ nhớ lưu trữ sẽ tiến hành generator sử dụng một giải pháp về tối ưu. Do họ vẫn chỉ ra đời những values mà họ cần. Với các function thông thường thì chúng ta vẫn cần xuất hiện trước các values và duy trì chúng nhằm hoàn toàn có thể sử dụng trong tương lai. Tuy nhiên thì cùng với generator thì chúng ta có thể trì hoãn sự tính tân oán này lại cho tới khi họ thực sự yêu cầu value trả về của chính nó.

Kết

Hi vọng qua bài viết này những bạn đã có cái nhìn ví dụ rộng về Generators. Hẹn gặp lại các bạn trong các bài viết sau.

Happy coding ~