异步小工具 asyncTool

class asyncTool {
  constructor () {
    this.arr = []
    this.ctx = {}
  }

  use (func) {
    const into = {
      func,
      next: () => {}
    }
    this.arr.push(into)
    if (this.arr.length > 1) {
      const index = this.arr.length - 2
      const nextFunc = () => {
        // console.info('func.length', func.length)
        this._innerRun(func, this.arr[index + 1].next)
      }
      this.arr[index].next = nextFunc
    }
    return this
  }

  getFuncName (fun) {
    var ret = fun.toString()
    ret = ret.substr('function '.length)
    ret = ret.substr(0, ret.indexOf('('))
    return ret
  }

  _innerRun (func, next) {
    console.info(`%cfuncName: ${this.getFuncName(func)}`, 'color:green')
    if (func.length === 0) {
      func()
    }
    if (func.length === 1) {
      func(next)
    }
    if (func.length === 2) {
      func(this.ctx, next)
    }
  }

  run () {
    if (this.arr.length > 0) {
      this._innerRun(this.arr[0].func, this.arr[0].next)
      // console.info('asyncTool func.length', this.arr[0].func.length)
    }
  }
}

export default asyncTool

const ac = new this.$asyncTool()
      ac.use(this.func1)
      ac.use(this.func2)
      ac.run()
posted @ 2020-11-24 14:10  彭成刚  阅读(1362)  评论(0编辑  收藏  举报