Async / Await 的使用

把异步操作包装成Promise
使用Async / Await
async函数返回一个promise对象

  1. // 把异步操作包装成Promise
  2. function ajax (url) {
  3. return new Promise((resolve, reject) => {
  4. var xhr = new XMLHttpRequest()
  5. xhr.open('GET', url)
  6. xhr.responseType = 'json'
  7. xhr.onload = () => {
  8. if (xhr.status === 200) {
  9. resolve(xhr.response)
  10. } else {
  11. reject(new Error(xhr.statusText))
  12. }
  13. }
  14. xhr.send()
  15. })
  16. }
  17. // 使用Async / Await
  18. async function main () {
  19. try {
  20. const users = await ajax('/api/users.json')
  21. console.log(users)
  22. const posts = await ajax('/api/posts.json')
  23. console.log(posts)
  24. const urls = await ajax('/api/urls.json')
  25. console.log(urls)
  26. } catch (e) {
  27. console.log(e)
  28. }
  29. }
  30. const promise = main()
  31. promise.then(() => {
  32. console.log('all completed')
  33. })

Async / Await的原理

Async / Await就是generator+promise+co函数的语法糖
把generator函数的*替换为async
把generator函数的yeild替换为await

generator+promise+co

Async就相当于把多个异步操作包装成一个promise对象
Await就相当于是内部异步操作的promise.then()的语法糖

  1. // 把异步操作包装成Promise
  2. function ajax (url) {
  3. return new Promise((resolve, reject) => {
  4. var xhr = new XMLHttpRequest()
  5. xhr.open('GET', url)
  6. xhr.responseType = 'json'
  7. xhr.onload = () => {
  8. if (xhr.status === 200) {
  9. resolve(xhr.response)
  10. } else {
  11. reject(new Error(xhr.statusText))
  12. }
  13. }
  14. xhr.send()
  15. })
  16. }
  17. // Generator 配合 Promise的异步解决方案
  18. function * main () {
  19. try {
  20. const users = yield ajax('/api/users.json')
  21. console.log(users)
  22. const posts = yield ajax('/api/posts.json')
  23. console.log(posts)
  24. const urls = yield ajax('/api/urls11.json')
  25. console.log(urls)
  26. } catch (e) {
  27. console.log(e)
  28. }
  29. }
  30. // 解决方案的使用方式
  31. // const g = generator()
  32. // const result = g.next()
  33. // result.value.then(data => {
  34. // const result2 = g.next(data)
  35. // if (result2.done) return
  36. // result2.value.then(data => {
  37. // const result3 = g.next(data)
  38. // if (result3.done) return
  39. // result3.value.then(data => {
  40. // g.next(data)
  41. // })
  42. // })
  43. // })
  44. // 解决方案的使用方式优化:递归调用
  45. function co (generator) {
  46. const g = generator()
  47. function handleResult (result) {
  48. if (result.done) return // 生成器函数结束
  49. result.value.then(data => {
  50. handleResult(g.next(data))
  51. }, error => {
  52. g.throw(error)
  53. })
  54. }
  55. handleResult(g.next())
  56. }
  57. // 使用co优化后的使用方式
  58. co(main)