1. function makePromisify(source) {
    2. if (source.then && typeof source.then === "function") return source
    3. return Promise.resolve(source)
    4. }
    5. function run(generatorFunc) {
    6. let it = generatorFunc()
    7. let result = it.next()
    8. return new Promise((resolve, reject) => {
    9. const next = function (result) {
    10. if (result.done) {
    11. resolve(result.value)
    12. }
    13. //保证返回的是一个promise
    14. result.value = makePromisify(result.value)
    15. result.value.then(res => {
    16. //将promise的返回值res传入iterator迭代器的next方法中,作为yield后面表达式的返回值
    17. //it.next将停止的yield继续执行到下一个yield,返回的result是一个value,done属性组成的对象
    18. let result = it.next(res)
    19. //递归执行next函数
    20. next(result)
    21. }).catch(err => {
    22. reject(err)
    23. })
    24. }
    25. next(result)
    26. })
    27. }
    28. const data = "{a:1,b:2}"
    29. const data2 = "{c:3,d:4}"
    30. const data3 = "{e:5,f:6}"
    31. const api = function (data) {
    32. return new Promise(resolve => {
    33. setTimeout(() => {
    34. resolve(data)
    35. }, 1000)
    36. })
    37. }
    38. function* func() {
    39. let res = yield api(data)
    40. console.log(res)
    41. let res2 = yield api(data2)
    42. console.log(res2)
    43. let res3 = yield api(data3)
    44. console.log(res3)
    45. console.log(res, res2, res3)
    46. }
    47. run(func)