美文网首页
前端小白成长之07--for of 迭代器Iterator

前端小白成长之07--for of 迭代器Iterator

作者: Clover园 | 来源:发表于2020-05-17 21:58 被阅读0次

以前一直用forEach (不能终止循环),some every for in 等,现在出来for of,挺好用break终止循环

可以编辑map,For of可以迭代的都是原型上有iterator方法


image

done表示迭代是否结束


image

实现对象的可迭代Iterable


image

迭代器列子


image

Generator 生成器

  • 避免异步编程中回调嵌套过深

  • function关键字与函数名之间有一个号。

  • 函数体内部使用yield表达式,定义不同的内部状态(yield在英语里的意思就是“产出”)

  • 执行Generator函数生成一个遍历器对象,用该对象调用其next()方法来遍历函数内部的状态

image
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);

相关文章

网友评论

      本文标题:前端小白成长之07--for of 迭代器Iterator

      本文链接:https://www.haomeiwen.com/subject/jaeeohtx.html