Skip to content

async/await原理 #1

@Saber2pr

Description

@Saber2pr
/// es5生成器generator
/// yield会保存执行位置,外部调用next回到yield处往下执行
function* generator() {
  const next1 = yield 1
  console.log(next1)

  const next2 = yield 2
  console.log(next2)

  const next3 = yield 3
  console.log(next3)
}
const iterator = generator()
console.log(iterator.next()) // 第一次调用返回第一次yield的值,后续每调用一次向后迭代一次
console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next()) // done true 意思是后面没有yield了,迭代结束
// next函数可接受一个值,会覆盖生成器中yield左边的值

/**
 * async实现
 * 未做异常处理
 * @param {() => IterableIterator<Promise<any>>} generator
 */
function async (generator) {
  // 调用生成器生成迭代器
  const iterator = generator()

  return function next(onfulfilled) {
    // 迭代一次
    const result = iterator.next(onfulfilled)
    // 如果yield完成,则返回
    if (result.done) return
    // 注册下一次迭代到promise回调中
    // 如果yield的值不是promise,则包装为Promise.resolve
    result.value.then ?
      result.value.then(onfulfilled => next(onfulfilled)) :
      Promise.resolve(result.value).then(onfulfilled => next(onfulfilled))
  }
}

const delay = (time, value) =>
  new Promise(res => setTimeout(() => res(value), time))

async (function* () {
  const first = yield 1
  console.log(first)

  const second = yield delay(1000, 2) // 阻塞2秒
  console.log(second)

  const third = yield 3
  console.log(third)
})()

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions