首页 > 其他 > 详细

Generator生成器

时间:2020-04-16 22:10:52      阅读:38      评论:0      收藏:0      [点我收藏+]

什么是生成器?

ES6的新语法,并不直接执行逻辑,而是生成一个对象--迭代器,通过调用这个对象的next()方法,来一步步向后走。执行完一个yield关键字就会停止,等待下一次next()调用。

funtion* myLogin(){
  yield 2;
  yield 5;    
}
var it = myLogin();
it.next(); // 2
it.next(); // 5

异步场景下的使用

function myAjax(){
        return fetch(‘https://img.alicdn.com/imgextra/i4/745475881/O1CN01VtOOnR1tJXl7Cnmcy_!!745475881.png‘);
    }
    function genRunner(genFunc){
        return new Promise(function(resolved, rejected){
            var it = genFunc();
            var innerRunner = function (data) {
                var val = it.next(data)
                if (val.done) {
                    resolved(val.value)
                    return
                }
                if (val.value) {
                    val.value.then(data => {
                        innerRunner(data)
                    })
                }else{
                    innerRunner(val.value)
                }
            }
            innerRunner();
        }
    )};


    genRunner(function*() {
        // generator函数中发起异步请求
        var serverData = yield myAjax();
        console.log(‘MyLogic after myAjax‘);
        console.log(‘serverStatus:%s‘,serverData.status);
    }).then(function (message) {
        console.log(message)
    })

在以上代码中,执行genRunner函数,生成器作为参数传入。genRunner函数中首先调用生成器得到迭代器it,然后调用innerRunner方法。第一次调用时,执行至生成器yield关键字结束,即发起了一个ajax请求,返回了一个promise对象。在innerRunner中,val.value就是这个promise对象,通过.then执行next(),将响应结果传到生成器中,就拿到了最后的状态码。此时innerRunner中的val为{value:undefined, done:true},执行最后的resolved函数,value为undefined,因此输出undefined

Generator生成器

原文:https://www.cnblogs.com/ashen1999/p/12715741.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!