Trình tạo – các bit gnarly

Quy cách dự thảo ECMAScript 6 đã mang lại nhiều niềm vui cho nhà phát triển JavaScript hiện đại. Chúng ta đã đề cập đến một số lớp bộ sưu tập mới và vòng lặp lặp lại for..of trong một bài đăng trước. Trong bài đăng này, chúng ta sẽ nói về một nội dung đi đôi với vòng lặp for..of: hàm trình tạo.

Có một loạt tài liệu hay đã được xuất bản, trong đó trình bày lý do và cách sử dụng trình tạo. Tóm lại, trình tạo là các hàm đặc biệt tạo trình lặp và trình lặp là các đối tượng có phương thức next(), có thể được gọi để lấy giá trị. Trong hàm trình tạo, từ khoá yield cung cấp giá trị cho next(). Việc sử dụng yield tạm ngưng quá trình thực thi hàm trình tạo, giữ nguyên trạng thái cho đến khi next() được gọi lại, tại thời điểm đó, mã sẽ bắt đầu khởi động lại và tiếp tục cho đến khi yield một giá trị khác (hoặc cho đến khi hàm trình tạo kết thúc). Có một số trường hợp sử dụng chính tắc cho các hàm trình tạo, chẳng hạn như sử dụng các hàm này để lặp lại các số trong tiến trình Fibonacci.

Sau khi tìm hiểu các kiến thức cơ bản, hãy cùng tìm hiểu sâu hơn về một mẫu JavaScript bao gồm một số điểm cần lưu ý khi làm việc với trình tạo. Có nhiều chú thích trong suốt mã và bạn có thể thử nghiệm với phiên bản trực tiếp của mã trước khi đọc toàn bộ mã:

Vậy bạn có thể rút ra những gì từ mã này?

Trước tiên, việc tạo một trình tạo sẽ dẫn đến một trình lặp duy nhất với trạng thái riêng biệt và bạn có thể truyền các tham số vào hàm khởi tạo trình tạo để có thể kiểm soát hành vi.

Thứ hai, bạn có thể truyền một tham số khi gọi phương thức next() của trình lặp và giá trị đó sẽ được chỉ định cho bất kỳ giá trị nào ở bên trái của câu lệnh yield từ lệnh gọi trình lặp trước đó. Đây là một cách hay để thay đổi đầu ra của trình lặp – ở đây, chúng ta sử dụng cách này để kiểm soát xem từ được tạo ra có viết hoa hay không. Nếu bạn muốn tác động đến giá trị đầu tiên được tạo ra, hãy thực hiện thông qua một tham số cho hàm khởi tạo của trình tạo.

Cuối cùng, trình tạo có thể tạo trình lặp có giới hạn hoặc vô hạn. Nếu bạn đang làm việc với một trình lặp vô hạn, hãy đảm bảo rằng bạn có một số loại điều kiện đầu cuối dựa trên giá trị yielded – rất dễ vô tình viết vòng lặp vô hạn, đặc biệt là khi sử dụng for..of để lặp lại. Nếu bạn đang làm việc với một trình lặp có giới hạn thông qua các lệnh gọi đến next(), thì thuộc tính .done của đối tượng được trả về sẽ báo hiệu liệu quá trình lặp đã hoàn tất hay chưa.

Chúng tôi hy vọng mẫu này cùng với các tài nguyên khác có trên web sẽ mang đến cho bạn sự hứng khởi và giúp bạn suy nghĩ về cách sử dụng trình tạo trong mã của riêng mình. Các phiên bản Firefox bắt đầu từ 31 và Chrome bắt đầu từ 39 hỗ trợ trình tạo gốc. Dự án Regenerator cung cấp tính năng hỗ trợ trình tạo cho các trình duyệt khác và bạn cũng có thể sử dụng Traceur.

Cảm ơn Erik Arvidsson đã giúp xem xét bài viết này.