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ả