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 协议 ,转载请注明出处!