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

Jeff Posnick
Jeff Posnick

Bản đặc tả kỹ thuật của bản nháp ECMAScript 6 đã mang lại nhiều nguồn niềm vui cho các 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 for..of trong một bài đăng trước đó. Trong bài đăng này, chúng ta sẽ đề cập đến một nội dung đi kèm với vòng lặp for..of: các hàm trình tạo.

Đã có sẵn một nguồn thông tin về tài liệu hay cho bạn biết 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 giúp tạo trình lặp và biến 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 dùng yield sẽ tạm ngưng việc thực thi hàm trình tạo, duy trì trạng thái cho đến khi next() được gọi lại, tại thời điểm đó, mã bắt đầu sao lưu và tiếp tục cho đến khi yield có một giá trị khác (hoặc cho đến khi hàm trình tạo chấm dứt). Có một số trường hợp sử dụng chính tắc cho hàm biểu thức, chẳng hạn như dùng các hàm này để lặp lại các số trong chuỗi Fibonacci.

Với các kiến thức cơ bản, hãy cùng tìm hiểu sâu hơn với mẫu JavaScript bao gồm một số vấn đề, hoặc “các đoạn khó hiểu” khi làm việc với các trình tạo. Có nhiều nhận xét trong suốt và bạn có thể thử sử dụng phiên bản trực tiếp của mã trước khi đọc qua:

Vậy những điểm đáng chú ý từ quy trình này là gì?

Trước tiên, việc tạo trình tạo sẽ tạo ra một trình lặp duy nhất có trạng thái riêng biệt của riêng trình tạo đó. Ngoài ra, bạn có thể truyền tham số vào hàm khởi tạo của trình tạo để 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 gán cho bất kỳ phần tử nào ở bên trái câu lệnh yield từ lệnh gọi biến lặp trước đó. Đây là một cách hay để thay đổi kết quả của biến lặp. Ở đây, chúng ta sử dụng nó để kiểm soát xem từ được tạo ra có đượ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, hãy thực hiện việc này thông qua một tham số đến hàm khởi tạo của trình tạo.

Cuối cùng, các trình tạo có thể tạo ra các biến lặp hữu hạn hoặc vô hạn. Nếu đang làm việc với một trình lặp vô hạn, hãy đảm bảo bạn có một số điều kiện cuối dựa trên giá trị yielded – rất dễ vô tình ghi 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 xử lý một trình lặp hữu 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 vòng 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ó sẵn trên web sẽ mang lại sự hứng thú và giúp bạn suy nghĩ về cách sử dụng trình tạo trong mã của mình. Các phiên bản Firefox bắt đầu bằng phiên bản 31 và Chrome bắt đầu với 39 trình tạo hỗ trợ sẵn. 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 anh đánh giá bài viết này.