Generator 实现

尉迟晔
2023-12-01

Generator 实现

Generator 是 ES6 中新增的语法,和 Promise ⼀样,都可以⽤来异步编程
// 使⽤ * 表示这是⼀个 Generator 函数
// 内部可以通过 yield 暂停代码
// 通过调⽤ next 恢复执⾏

function* test() {
 let a = 1 + 2;
 yield 2;
 yield 3; }
let b = test();
console.log(b.next()); // > { value: 2, done: false }
console.log(b.next()); // > { value: 3, done: false }
console.log(b.next()); // > { value: undefined, done: true }

从以上代码可以发现,加上 * 的函数执⾏后拥有了 next 函数,也就是说 函数执⾏后返回了⼀个对象。每次调⽤ next 函数可以继续执⾏被暂停的代 码。以下是 Generator 函数的简单实现。

// cb 也就是编译过的 test 函数
function generator(cb) {
return (function() {
var object = {
next: 0,
stop: function() {}
};
return {
next: function() {
var ret = cb(object);
if (ret === undefined) return { value: undefined, done: true };
return {
value: ret,
done: false
};
}
};
})(); }
// 如果你使⽤ babel 编译后可以发现 test 函数变成了这样
function test() {
var a;
return generator(function(_context) {
while (1) {
switch ((_context.prev = _context.next)) {
// 可以发现通过 yield 将代码分割成⼏块
// 每次执⾏ next 函数就执⾏⼀块代码
// 并且表明下次需要执⾏哪块代码
case 0:
a = 1 + 2;
_context.next = 4;
return 2;
case 4:
_context.next = 6;
return 3;
// 执⾏完毕
case 6:
case "end":
return _context.stop();
}
}
}); }

每日一句中文式外语

菲律宾语

早上好:
马竿大,五马大(联想记忆:马竿有多大?有五匹马那么大)
中午好:
马竿大,打哈累(联想记忆:马竿太大了,打得我好累)
下午好:
马竿大,哈蹦 (联想记忆:马竿太大,打的马儿哈哈的,蹦起来了,哈蹦)
马竿大就是:形容姑娘漂亮的意思,可以撩妹的时候用。
亲爱的,你真美:
马竿大,哈挺打哈累(联想记忆:马竿太大,你哈挺着腰,打着哈儿,太累了)

菲律宾是亚热带地区,用的也是东八区(北京时间),很多两广福建以及台湾,香港的华侨下海讨生活定居在菲律宾。风景美,姑娘更美。
好了,先聊到这吧!
米娜,撒有哪啦!(再见了,大家)

 类似资料: