实现简单的generators自动执行Co 模块

let axios = require("axios")
var co = require('co');
/**
 * 实现简单的Co 模块 自动执行next
 */
let step1 = () => {
  return axios.get('https://movie2.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start=0', {
    params: {
      ID: 12345
    }
  })
}

let step2 = () => {
  return 'hello,world'
}

let step3 = () => {
  return () => {
    return 'My is Function'
  }
}
function MyCo(generator) {
  let generators = generator()
  return new Promise(function (resolve, reject) {
    function next(nextValue) {
      try {
        
        if (nextValue.done) {
          resolve()
          return;
        }
        if (!next.done) {
          //如果是函数直接返回内部函数供generator自行处理
          if (typeof nextValue.value === 'function') {
            //回复yield 将执行指向下一个函数执行,并将nextValue.value当作结果返回
            next(generators.next(nextValue.value))
          }
          //如果是字符串直接将字符串返回
          if (typeof nextValue.value == 'string') {
            next(generators.next(nextValue.value))
          }
          //判断是否是Promise异步使用
          if (Object.prototype.toString.call(nextValue.value) == '[object Promise]') {
            nextValue.value.then((res) => {
              next(generators.next(res.data))
            }).catch((error) => {
              //异常处理
              reject(error)
            })
          }
        }
      } catch (err) {
        console.log(err)
      }
    }
    next(generators.next())

  })

}
function* f() {
  let FnString = yield step3()
  console.log(FnString()) //My is Function
  let res = yield step1();
  console.log(res)
  let string = yield step2()
  console.log(string) //hello,world

}

MyCo(f).then(() => {
  console.log('执行结束')
}).catch((error) => {
  console.log('异常捕获')
  console.log(error)
})

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值