ES 6 ra mắt một cách thức trọn vẹn new được cho phép họ làm việc với function cùng iterator là Generator (xuất xắc hàm sinh). Generator là function hoàn toàn có thể thể giới hạn giữa chừng cùng tiếp nối tiếp tục tự vị trí mà nó vẫn dừng. Nói một giải pháp nthêm gọn thì generators nó là iterator đội dấu function =))

Fun fact: async/await được thi công dựa vào generators.

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

Generators có mối tương tác mật thiết cùng với iterators. Nếu chúng ta chưa chắc chắn về iterator thì các bạn có thể coi nhanh bài viết này nhé

*

yield tại chỗ này có chức năng tựa như nhỏng return ở đoạn nó "trả về" giá trị được khái niệm sau nó. Điểm không giống của chính nó là ở chỗ nó gìn giữ tâm lý của hàm tại địa điểm yield được điện thoại tư vấn nhằm mục tiêu mục đích sinh sống lần Hotline next() tiếp theo của bọn họ nó rất có thể chạy tiếp tự vị trí nó đang chạy dsinh sống. Đó là nguyên do từ khóa yield Thành lập, họ sẽ nói là hàm x yield một quý giá chứ không hẳn là return

Tạo một Generator

Sau đây là ví dụ nhằm chế tạo ra 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 thực hiện cú pháp function * vậy vày function để knhị báo một generator. Do nó cũng chỉ là function bắt buộc chúng ta có thể áp dụng sinh sống bất kỳ đâu nhỏng so với function thường thì.

Dường như thì chúng ta có thể return tự generator. Tuy nhiên thì Khi gọi return đang cấu hình thiết lập quý giá đến done thành true - những điều đó là generator sẽ không thể sinh ra thêm cực hiếm như thế nào nữa:

Tại mẫu vật dụng 3, bọn họ sẽ tạo ra một object generator. Nếu chúng ta sẽ hồi hộp vày thấy nó y hệt như vẫn điện thoại tư vấn hàm thì chúng ta yên chổ chính giữa là các bạn đang đúng nhé =)): Khi họ Call hàm generator thì loại mà nó trả về là một trong object generator. Object generator này là một trong những iterator đề xuất chúng ta có thể áp dụng nó trong khoảng lặp for-of hoặc trong những fucntion khác đồng ý đối số truyền vào là iterable.

Ở dòng 4 thì chúng ta Hotline hàm next() bên trên generatorObject. Với lời gọi này thì generator bắt đầu được thực hiện tính năng của chính nó. trước hết thì nó console.log mẫu This will be executed first. Sau kia thì Khi nó chạy không còn mẫu yield "Hello, thì generator đã yield ra một object bao gồm câu chữ nhỏng sau: value: "Hello, ", done: false và tạm dừng.

Tại loại đồ vật 5 thì chúng ta lại call next(). Lần này thì generator vẫn lại chạy tiếp bắt đầu từ chỗ nó đang ngừng. trước hết nó vẫn 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 gồm văn bản là value: "World!", done: false . Chúng ta đã chỉ extract nằm trong tính value nhằm in nó. Generator lại tiếp tục bị tạm ngưng.

Tại chiếc máy 6 thì họ lại Hotline next(). Lần này thì không thể string làm sao để in ra được nữa. Trong trường hòa hợp này thì generators sẽ return một object là value: undefined, done: true nạm vày yield. Giá trị của cờ done được set thành true ,

Trong trường họp bọn họ mong chạy lại generator từ đầu thì đang phải tạo lập một generator bắt đầu.

Xem thêm: Office 2007 Full Crack Sinhvienit, Tải Microsoft Office 2007 Full Rack

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

Có rất nhiều tình huống thiết thực nhưng họ sẽ tiến hành thụ hưởng từ các việc sử dụng generator. Chúng ta hãy cùng chiêm ngưỡng nào.

Implement một iterables

Bình hay Khi họ implement một iterator thì bọn họ đang đề nghị từ bỏ chế tạo một object iterator thủ công với function next(). Hình như thì state của chính nó bọn họ cũng đề xuất lưu giữ thủ công bằng tay. Do generators cũng chính là iterables đề nghị chúng cũng hoàn toàn có thể được dùng làm implement một iterables một giải pháp nlắp gọn gàng và dễ đọc rộng. 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 bên dưới đã thực hiện 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 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 bản sinh hoạt bên trên thì chúng ta có thể thấy phiên phiên bản áp dụng generator thừa trội hơn hẳn do:

Chúng ta không hẳn implement function next()Chúng ta không hẳn biên soạn nội dung object trả về một giải pháp thủ công bằng tay, ví dụ như ngơi nghỉ trên là value: "This", done: false Chúng ta không phải quan tâm cho state của function. Nlỗi sống trong ví dụ với iterator chúng ta phải tạo thay đổi step để lưu giữ state. Biến state này đã đưa ra quyết định output trường đoản cú iterable. Với generator thì bọn họ không hẳn quan tâm mang lại sự 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 nên một generator cùng với khả năng sinch 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ể áp dụng Generator nhỏng một observerChúng ta có thể cần sử dụng hàm next(val) để gửi kèm dữ liệu mang đến mang lại generator. Mà mỗi lần bọn họ Gọi gửi value mang đến mang đến generator như vậy là bọn họ vẫn "đánh thức" generator dậy. Chính bởi vậy đề nghị bạn có thể coi generator nhỏng là một trong obhệ thống vì nó luôn luôn quan liêu gần cạnh value được truyền vào và sẽ sở hữu được hành vi ví dụ kèm theo tương ứng.

Ưu điểm của Generators

Lazy evaluation

Nhỏng trong ví dụ luồng dữ liệu rất nhiều thì bạn cũng có thể làm cho được điều này là nhờ lazy evaluation. Lazy evaluation là một quy mô tính toán đang trì hoãn việc tính tân oán của một biểu thức cho đến lúc nào chúng ta yêu cầu. vì thế tức là giả dụ chúng ta ko cần cho nó thì nó sẽ không được xem toán. Hãy coi ví dụ sau nhé:

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

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

Một hệ quả của Lazy Evaluation là bộ nhớ sẽ tiến hành generator áp dụng một phương pháp về tối ưu. Do bọn họ đang chỉ ra đời các values nhưng bọn họ yêu cầu. Với các function thông thường thì họ vẫn bắt buộc có mặt trước các values với giữ lại bọn chúng để có thể dùng về sau. Tuy nhiên thì cùng với generator thì bạn cũng có thể trì hoãn sự tính tân oán này lại cho đến Lúc chúng ta đích thực bắt buộc 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ó ánh nhìn cụ thể rộng về Generators. Hẹn gặp gỡ lại chúng ta trong những nội dung bài viết sau.

Happy coding ~

Bài viết liên quan

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *