HomeĐời SốngGenerator là gì

Generator là gì

13:25, 29/03/2021

ES 6 reviews một cách thức hoàn toàn bắt đầu được cho phép bọn họ thao tác làm việc với function với iterator là Generator (hay hàm sinh). Generator là function hoàn toàn có thể thể giới hạn thân chừng và tiếp nối liên tục trường đoản cú chỗ nhưng nó đang dừng. Nói một biện pháp nđính thêm gọn 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 bao gồm mối liên hệ trực tiếp với iterators. Nếu chúng ta không biết về iterator thì các chúng ta có thể coi nkhô hanh nội dung bài viết này nhé

*

yield tại chỗ này gồm công dụng tựa như nlỗi return tại đoạn nó "trả về" quý hiếm được khái niệm sau nó. Điểm không giống của chính nó là ở phần nó giữ gìn 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 tiêu mục tiêu sinh sống lần Điện thoại tư vấn next() tiếp theo sau của bọn họ nó hoàn toàn có thể chạy tiếp từ bỏ khu vực nó đang làm việc dsống. Đó là nguyên nhân từ khoá yield thành lập, họ đã nói là hàm x yield một giá trị chứ không phải là return

Tạo một Generator

Sau đây là ví dụ nhằm tạo một generator trong 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 áp dụng cú pháp function * nỗ lực bởi function nhằm knhì báo một generator. Do nó cũng chỉ là function phải bạn có thể áp dụng nghỉ ngơi ngẫu nhiên đâu nlỗi so với function thông thường.

Trong khi thì chúng ta cũng có thể return từ bỏ generator. Tuy nhiên thì khi hotline return vẫn tùy chỉnh cấu hình giá trị mang lại done thành true - những điều đó là generator sẽ không thể hiện ra thêm quý hiếm như thế nào nữa:

Tại chiếc sản phẩm công nghệ 3, chúng ta đã tạo ra một object generator. Nếu chúng ta đang bối rối vị thấy nó giống hệt như đã Gọi hàm thì chúng ta yên vai trung phong là các bạn sẽ đúng nhé =)): lúc họ hotline hàm generator thì cái nhưng mà nó trả về là một trong object generator. Object generator này là một trong những iterator cần chúng ta cũng có thể áp dụng nó trong khoảng lặp for-of hoặc trong những fucntion không giống đồng ý đối số truyền vào là iterable.

Ở cái 4 thì họ Call hàm next() trên generatorObject. Với lời Gọi này thì generator bắt đầu được triển khai tính năng của nó. Thứ nhất thì nó console.log cái This will be executed first. Sau đó thì Lúc nó chạy hết cái yield "Hello, thì generator đã yield ra một object gồm văn bản nhỏng sau: value: "Hello, ", done: false cùng tạm ngưng.

Tại cái lắp thêm 5 thì chúng ta lại Điện thoại tư vấn next(). Lần này thì generator đã lại chạy tiếp bước đầu từ chỗ nó vẫn giới hạn. Trước tiên nó sẽ console.log xâu I will be printed after the pause. Một lần nữa nó lại gặp yield, objext được yield có văn bản là value: "World!", done: false . Chúng ta đã chỉ extract trực thuộc tính value để in nó. Generator lại tiếp tục bị tạm dừng.

Ở dòng đồ vật 6 thì chúng ta lại Call next(). Lần này thì không thể string làm sao để in ấn ra nữa. Trong ngôi trường phù hợp này thì generators vẫn return một object là value: undefined, done: true nỗ lực vị yield. Giá trị của cờ done được set thành true ,

Trong trường họp chúng ta mong muốn chạy lại generator từ trên đầu thì vẫn phải khởi tạo một generator bắt đầu.

Xem thêm: Bigo Là Gì - Nhức Nhối “Ổ Mại Dâm Di Động” Trên Bigo Live

Khi nào thì sử dụng Generator

Có không hề ít trường hợp thiết thực cơ mà bọn họ sẽ được thụ hưởng từ việc áp dụng generator. Chúng ta hãy hãy cùng chiêm ngưỡng nào.

Implement một iterables

Bình thường xuyên Lúc chúng ta implement một iterator thì họ sẽ buộc phải trường đoản cú tạo nên một object iterator thủ công bằng tay cùng với function next(). Trong khi thì state của chính nó bọn họ cũng buộc phải lưu bằng tay. Do generators cũng chính là iterables yêu cầu bọn chúng cũng hoàn toàn có thể được dùng để implement một iterables một giải pháp ngắn thêm gọn và dễ đọc hơn. Hãy thuộc xem 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 áp dụng iterator để 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à đây là đoạn code sử 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 thân 2 phiên phiên bản sinh hoạt trên thì chúng ta có thể thấy phiên bạn dạng thực hiện generator quá trội hơn nhiều do:

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

Chúng ta hoàn toàn có thể tạo ra một generator cùng với kĩ năng sinc dữ liệu vô và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ũng có thể thực hiện Generator như một observerChúng ta rất có thể dùng hàm next(val) nhằm gửi kèm dữ liệu đến đến generator. Mà những lần bọn họ Call gửi value mang đến mang lại generator điều này là chúng ta đã "tiến công thức" generator dậy. Chính bởi vậy phải chúng ta cũng có thể coi generator nlỗi là 1 trong những observer bởi vì nó luôn quan tiền gần cạnh value được truyền vào và sẽ có được hành vi rõ ràng cố nhiên tương ứng.

Ưu điểm của Generators

Lazy evaluation

Nlỗi vào ví dụ luồng dữ liệu vô vàn thì chúng ta có thể làm được điều này là nhờ vào lazy evaluation. Lazy evaluation là một trong quy mô tính toán đang trì hoãn câu hỏi tính toán của một biểu thức cho tới lúc nào họ bắt buộc. vì vậy nghĩa là nếu như chúng ta không đề xuất đến nó thì nó sẽ không được tính 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 bọn họ Hotline powersOf2 = powerSeries(3, 2); thì họ mới chỉ đơn thuần là tạo ra một object generator, chưa xuất hiện quý hiếm nào được tính toán. Sau kia, trường hợp họ điện thoại tư vấn tiếp next() thì nó và tính toán ra cực hiếm 9 với trả về công dụng.

Sử dụng buổi tối ưu bộ nhớ

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

Kết

Hi vọng qua nội dung bài viết này những bạn đã có tầm nhìn cụ thể rộng về Generators. Hẹn gặp mặt lại chúng ta trong những bài viết sau.

Happy coding ~