用Generator将Promise的异步流程同步化
/**
* fn:Generator函数对象
*/
function generatorFunctionRunner(fn){
//定义分步对象
let generator = fn() //执行到第一个yield
let step = generator.next() //定义递归
function loop(stepArg,generator){
//获取本次的yield右侧的结果
let value = stepArg.value //判断结果是不是Promise对象 if(value instanceof Promise){
//如果是Promise对象就在then函数的回调中获取本次程序结果 //并且等待回调执行的时候进入下一次递归 value.then(function(promiseValue){
if(stepArg.done == false){
loop(generator.next(promiseValue),generator)
} })
}else{ //判断程序没有执行完就将本次的结果传入下一步进入下一次递归 if(stepArg.done == false){
loop(generator.next(stepArg.value),generator)
}
} }
//执行动态调用
loop(step,generator)
}
function * test(){
var res1 = yield new Promise(function(resolve){
setTimeout(function(){ resolve('第一秒运行')
},1000) })
console.log(res1)
var res2 = yield new Promise(function(resolve){
setTimeout(function(){ resolve('第二秒运行')
},1000) })
console.log(res2)
var res3 = yield new Promise(function(resolve){
setTimeout(function(){ resolve('第三秒运行')
},1000) })
console.log(res3)
}
generatorFunctionRunner(test)
网友评论