generator
console.log(Array.from({0:1,1:2,2:3, length:3}));
console.log([...{0:1,1:2,2:3, length:3, [Symbol.iterator]: function* () {
yield 1;
yield 2;
yield 3;
}}])
console.log([...{0:1,1:2,2:3, length:3, [Symbol.iterator]: function() {
let arr = this;
let index = 0;
return {
next() {
return { value: arr[index], done: index++ == arr.length }
}
}
}}])
console.log([...{0:1,1:2,2:3, length:3, [Symbol.iterator]: function* () {
let index = 0;
while(index !== this.length) {
yield this[index];
}
}}])
co的实现
function* read() {
const a = yield fs.readFile("a.txt", "utf8");
const b = yield fs.readFile(a, "utf8");
return b;
}
function co(it) {
return new Promise((resolve, reject) => {
function next(data) {
let { value, done } = it.next(data);
if(done) {
return resolve(value);
}
Promise.resolve(value).then(data => {
next(data);
}, reject)
}
next();
})
}
co(read()).then(data => {
console.log(data);
})
- async + await => co + generator 语法糖