Generator 解决异步方案
示例代码
/* 封装promise异步函数 */
let requestData=(param) => {
return new Promise((resolve,reject) => {
setTimeout(() => {
resolve(param)
},2000);
})
}
/* 封装一个生成器 */
let genFn=function*() {
/* 将promise对象作为结果通过yield返回
调用next函数传递的参数,必须通过上一个yield去接收
*/
const value1=yield requestData('aaa')
const value2=yield requestData(value1+'bbb')
const value3=yield requestData(value2+'ccc')
console.log(value3)
}
/* 封装生成器递归next函数 */
let deepNext=function(genFn) {
// 获取生成器对象
let genObj=genFn()
// 创建递归函数,并接受参数,参数为上一次next函数调用的结果
let deepGen=function(res) {
// 执行生成器next函数并获得返回的结果 { done:false/true, value: promise/undefined }
let result=genObj.next(res)
// 对结果状态进行判断,判断是否已经全部执行完毕,如果全部执行完毕则结束递归
if(result.done) return result.value
// 如果没有执行完毕,则调用promise对象,并将回调结果作为参数传递,进行递归调用
result.value.then(res1 => {
deepGen(res1)
})
}
deepGen()
}
/* 调用生成器递归函数 */
deepNext(genFn)
res --> 'aaabbbccc'
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!