ES6迭代器的一个例子
function run(taskDef) {
var task = taskDef();
var result = task.next();
// 递归执行迭代
function step() {
if(result.done) return;
result.value(function(txt) {
console.log(txt);
result = task.next();
step();
});
}
step();
}
function *a() {
yield function (cb) {
setTimeout(function () {
cb('第一次异步');
}, 1000);
};
}
function b() {
return function (cb) {
setTimeout(function () {
cb('第二次异步');
}, 1000);
};
}
run(function *() {
console.log('异步开始执行...');
// a, b都是异步代码, 在这却以同步顺序
yield *a();
yield b();
console.log('完成了!');
});
这个例子包含了生成器委托, 异步迭代器, 迭代器是ES6发布的很重要的一个功能, 可用Symbol.iterator
定义对象的生成器, 只有具备Symbol.iterator
的对象才是可迭代对象, 字符串也具有一个默认的迭代器, 扩展运算符...
会受到Symbol.iterator
的影响, 生成器委托促进了对迭代器行为的良好封装, 能够重用已有生成器, 使用yield *
后跟已有生成器即可实现, 生成器和迭代器可创建外观清晰的异步代码