async函数实在ES2017标准钟引进的,它是generator函数的语法糖,并对generator函数做了以下改进
    1、内置执行器:generator函数返回的是迭代器,而async函数内置执行器自动执行迭代器
    2、更好的语义:async/await比*和yield语义更清楚,async表示函数里有异步操作,await表示紧跟在后面的表达式需要等待结果。
    3、返回promise:async函数的返回值是 Promise 对象,这比 Generator 函数的返回值是 Iterator 对象方便多了。你可以用then方法指定下一步的操作。

    基本用法:

    1. const promiseData = Promise.resolve('result') // 定义一个promise
    2. const test1 = async () => {
    3. const num = await 6
    4. const result = await promiseData
    5. return result
    6. }
    7. const test2 = async () => {
    8. const result = await promiseData
    9. const num = await 6
    10. return num
    11. }
    12. test1().then(val => console.log(val)) // result
    13. test2().then(val => console.log(val)) // 6

    我们可以看到不管await后面接的是普通值还是promise,最后返回的都是promise,前面说过了,async函数是generator函数的语法糖,并且带有执行器,下面我们用asyncTogenerator函数来实现同样的功能

    上面例子中,两个async函数我们先改写成generator函数:

    1. const promiseData = Promise.resolve('result') // 定义一个promise
    2. function * geneTest1() {
    3. const num = yield 6
    4. const data = yield promiseData
    5. }
    6. function * geneTest2() {
    7. const data = yield promiseData
    8. const num = yield 6
    9. }
    10. // const gene1 = geneTest1()
    11. // const gene2 = geneTest2()

    我们要实现的效果是:

    1. const asyncTogen1 = asyncTogenerator(geneTest1)
    2. const asyncTogen2 = asyncTogenerator(geneTest2)
    3. asyncTogen1().then(val => console.log(val)) // result
    4. asyncTogen2().then(val => console.log(val)) // 6

    实现一个asyncToGenerator,经过asyncToGenerator包装过的generator,就跟async函数一样

    1. // 版本一
    2. const asyncToGenerator = (generatorFunc) => {
    3. return function(...args) {
    4. const gen = generatorFunc.call(this, ...args)
    5. let preValue
    6. const next = (result) => {
    7. const { done, value } = result
    8. if(!done) {
    9. preValue = value
    10. return Promise.resolve(value).then(
    11. val => next(gen.next(val)),
    12. err => next(gen.throw(err))
    13. )
    14. } else {
    15. return Promise.resolve(preValue)
    16. }
    17. }
    18. return next(gen.next())
    19. }
    20. }
    21. // 版本二
    22. const asyncToGenerator = (generatorFunc) => {
    23. return function(...args) {
    24. const gen = generatorFunc.call(this, ...args)
    25. let preValue
    26. return new Promise((resolve, reject) => {
    27. let preValue
    28. const step = (key, val) => {
    29. let result
    30. try {
    31. result = gen[key](val)
    32. } catch (error) {
    33. reject(error)
    34. }
    35. const { value, done } = result
    36. if (done) {
    37. resolve(preValue)
    38. } else {
    39. preValue = value
    40. return Promise.resolve(value)
    41. .then(
    42. val => step('next', val),
    43. err => step('throw', err)
    44. )
    45. }
    46. }
    47. return step('next')
    48. })
    49. }
    50. }