Generator

作者: 我叫Aliya但是被占用了 | 来源:发表于2019-12-22 17:08 被阅读0次

基本用法

function *fn () {
    console.log('welcome to lili`s store')
    let comd = yield 'what`s can i help?'
    console.log(comd)
    switch (comd) {
        case 'go home': 
            yield 'as your wish'
            break
        case 'pen': 
            yield '$10'
            break
    }
    return 'thank you for your patronage.'
}
let lili = fn()
console.log('lili fond a stroe')
let server = lili.next()
console.log(server.done, server.value)
server = lili.next('go home')
console.log(server.done, server.value)
server = lili.next()
console.log(server.done, server.value)  // 基本上是几个yield几个next

更详细用法看ES6 Generator

迭代器

// 给对象添加迭代器,[Symbol.iterator]的返回值就是一个迭代器
// 使用generator实现迭代器
var fakearr = {0:1,1:2,2:3,length: 3, [Symbol.iterator]: function* () {
// var fakearr = {'aaa': {name: 'aaa'},'bbb': {name: 'bbb'},'ccc': {name: 'ccc'}, length: 3, [Symbol.iterator]: function* () {
    console.log('this~~', Object.keys(this))
    let keys = Object.keys(this)
    for (let i = 0; i < keys.length; i++) {
        if (keys[i] != 'length') 
            yield this[keys[i]]
    }
    return;
} }
console.log([...fakearr])
// 直接写一个迭代器
// 迭代器:一个对象包含next方法,方法返回{value, done}
var fakearr = {0:1,1:2,2:3,length: 3, [Symbol.iterator]: function () {
    let _t = this, index = 0;
    return {
        next() {
            return {value: _t[index], done: index++ == _t.length}
        }
    }
} }

co

即generator的执行器,实现依靠promise,且yield的必须是function, promise, generator, array, or object

let co = require('./co').co
function delay(time){
    return function(fn){
      setTimeout(function(){
        console.log('delay', fn(null, 44))
      },time)
    }
}

console.time('ttt')
co(function* (){
    yield delay(2200);
    yield delay(2000);
    yield delay(1000);
}) .then(function (){
    console.log('Generator 函数执行完成');
    console.timeEnd('ttt')
})

尝试实现

co = function (gfn) {
    return new Promise((resolve, reject) => {
        let gen = gfn()
        let step = arg => {
            let {value, done} = gen.next(arg)
            if (done) return resolve(value)
            if (value.then && typeof value.then == 'function') {
                Promise.resolve(value).then(data => step(data))
            }
            if (typeof value == 'function') {
                value((err, res) => step(res))
            }
        }
        step()
    })
}

相关文章

网友评论

      本文标题:Generator

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