基本用法
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()
})
}
网友评论