以前一直用forEach (不能终止循环),some every for in 等,现在出来for of,挺好用break终止循环
可以编辑map,For of可以迭代的都是原型上有iterator方法
image
done表示迭代是否结束
image
实现对象的可迭代Iterable
image
迭代器列子
image
Generator 生成器
-
避免异步编程中回调嵌套过深
-
function关键字与函数名之间有一个号。
-
函数体内部使用yield表达式,定义不同的内部状态(yield在英语里的意思就是“产出”)
-
执行Generator函数生成一个遍历器对象,用该对象调用其next()方法来遍历函数内部的状态
function* generator(txt) {
console.log(txt); // 2 第一次调用生成迭代对象,传参
let result01 = yield '停止';
console.log(result01); // 4 传参替换yield;
}
let g = generator('第一次调用生成迭代对象,传参');
console.log('主线程'); // 1
let step01 = g.next();
console.log(step01.value);// 3 停止
g.next('传参替换yield');
console.log('结束~'); // 5
//封装co
function co (generator){
const g = generator();
function handleResult (result){
if(result.done) return;//生成器结束
result.value.then(data=>{
handleResult(g.next(data))
},error=>{
g.throw(error)
})
}
handleResult(g.next());
}
var foo = 100;
function * main(){
foo = foo+(yield Promise.resolve(10))
console.log('main',foo)
}
co(main);
foo++;
console.log('global',foo);
//global 101
//main 110
-------------上面生成器就像下面async语法糖------
//走到fools + await Promise时,fools是100,后面awiat是异步,进入微任务,等待console.log('s'+fools)结束,继续执行微任务 console.log('d'+fools),打印出110
var fools =100;
async function main(){
fools = fools + await Promise.resolve(10);
console.log('d'+fools)
};
main();
fools++;
console.log('s'+fools);
网友评论