美文网首页
前端小白成长之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