Dạ em có một generator function như sau:
function* test() {
const foo = yield 3;
console.log(foo);
const bar = yield 4;
console.log(bar);
}
const abc = test();
console.log(abc.next()); // { value: 3, done: false }
console.log(abc.next()); // { value: 4, done: false }
console.log(abc.next()); // { value: undefined, done: true }
Kết quả là:
{ value: 3, done: false }
undefined
{ value: 4, done: false }
undefined undefined
{ value: undefined, done: true }
Em có 5 thắc mắc mong được mọi người giải đáp.
Tại sao function* test có 2 yield, yeild cuối cùng có value là 4 nhưng tại sao thuộc tính done vẫn là false (nghĩa là test vẫn chưa kết thúc) mà dòng console.log thứ 3 có value là undefined mà done lại là true? Vậy lúc value là 4 thì con trỏ đang ở vị trí nào? trước số 4 hay sau số 4?
Tại sao console.log(foo) và console.log(bar) đặt sau yield nhưng bị undefined? Có nghĩa là yeild không gán giá trị cho bar và foo đúng không?
Em sửa lại đoạn code bằng cách truyền argument vào function next()
function* test() {
const foo = yield 3;
console.log(foo);
const bar = yield 4;
console.log(bar);
}
const abc = test();
abc.next(123); //<====
abc.next(456); //<====
abc.next(789); //<====
Kết quả là:
123
456
Tại sao lúc này lại in ra được foo và bar?
Vậy cuối cùng làm sao in được số 3 và số 4?
Nguyên lý của function* trong javascript có giống với Iterator trong java như bài biết dưới đây không?
Có phải vì javascript không có class Iterator nên mới nghĩ ra function* để thay thế?
Em cảm ơn.
Em có đọc qua bài viết này nhưng vẫn không hiểu gì cả 


83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?