Hoạt động một lần của iterator trong JavaScript
Mỗi iterator chỉ có thể tham gia vào một vòng lặp
một lần duy nhất. Điều này hơi bất ngờ,
nhưng hợp lý - bởi vì iterator sau khi đã chạy hết
sẽ đặt thuộc tính done của nó thành false,
điều đó có nghĩa là nó không thể được lặp lại nữa.
Hãy cùng kiểm chứng điều này. Giả sử chúng ta có generator sau:
function *func() {
yield 1;
yield 2;
yield 3;
}
Tạo một iterator:
let iter = func();
Duyệt iterator bằng một vòng lặp:
for (let elem of iter) {
console.log(elem); // 1, 2, 3
}
Bây giờ hãy thử duyệt iterator bằng hai vòng lặp:
for (let elem of iter) {
console.log(elem); // 1, 2, 3
}
for (let elem of iter) {
console.log(elem); // không hoạt động
}
Để giải quyết vấn đề này, cần tạo một iterator mới cho mỗi vòng lặp mới:
let iter1 = func();
for (let elem of iter1) {
console.log(elem); // 1, 2, 3
}
let iter2 = func();
for (let elem of iter2) {
console.log(elem); // 1, 2, 3
}
Chúng ta có thể đơn giản hóa:
for (let elem of func()) {
console.log(elem); // 1, 2, 3
}
for (let elem of func()) {
console.log(elem); // 1, 2, 3
}
Sửa lỗi được mắc phải trong đoạn code sau:
function *func() {
for (let i = 1; i <= 3; i++) {
yield i;
}
}
let elems = func();
for (let elem of elems) {
console.log(elem);
}
for (let elem of elems) {
console.log(elem);
}