脚本宝典收集整理的这篇文章主要介绍了javascript 迭代器案例逐步认识,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
es6 generate
是什么东西?
迭代器 : 是一种协议,每一次迭代的值都跟上一次迭代的不一样,总会有一个next 总能拿到一个对象
生成器:生成一个可以返回迭代器的函数,本质上还是操作迭代器,更加方便的使用迭代器,每次返回的都是promise
。
一: 认识什么是generate
function* gen(){
yield 1
yield* add()
yield x // 传递参数
return 4
}
function* add(){
yield 11
yield 12
}
const g = gen()
LOG( g.next() ) // {done:false,value;1}
log( g.next() ) // {done:false,value;11}
log( g.next() ) // {done:false,value;12}
log( g.next(3) ) // {done:false,value;3} // 注意这里
log( g.next() ) // {done:false,value;4}
log( g.next() ) // {done:true,value;undefined}
2:
// log 打印函数
const log = s => console.log.call(this,s)
// sleep 睡眠函数
const sleep = (cb,t) => setTimeout( cb.bind(this) ,t)
function* request(resume){
yield sleep( ()=>{ console.log(1)} ,1000)
yield sleep( ()=>{ console.log(2)} ,2000)
yield sleep( ()=>{ console.log(3)} ,3000)
}
var g = request()
g.next() // 1
g.next() // 2
g.next() // 3
3: 改进版本,实现自执行
// 迭代器自执行函数
function run(generatorFunction) {
var generatorItr = generatorFunction(resume)
function resume(callbackValue) {
generatorItr.next(callbackValue);
}
generatorItr.next()
}
function* request(resume){
let a = yield sleep( ()=>{
console.log(1)
resume()
} ,1000)
yield sleep( ()=>{
console.log(2)
resume()
} ,2000)
yield sleep( ()=>{ console.log(3) } ,3000)
}
run(request) // 依次执行 1,2,3
4: ajax 异步自执行
const urls = ['url1','url2','url3']
const req = (cb,url) => setTimeout( cb.bind(this,url) ,1000)
function* request(arr){
for(let i=0; i<arr.length; i++){
yield getQ(arr[i])
}
}
function getQ(url){
var p = new Promise((resolve,reject)=>{
req((u)=>{
if(u){
resolve(u)
}else{
reject(u)
}
},url)
})
p.then((r)=>{
g.next()
})
}
// 可以借助上面run函数执行,这里就直接执行
var g = request(urls)
g.next() // 依次执行结果是: url1 url2 url3
5: 终极解决放啊 在node,我们一般使用 TJ 大神的 co
库来解决这个run
函数调用的问题:
co(function* (){
var result = yield PRomise.resolve(true)
return result
}) .then((v)=>{
log(v)
})
以上是脚本宝典为你收集整理的javascript 迭代器案例逐步认识全部内容,希望文章能够帮你解决javascript 迭代器案例逐步认识所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。