初步的链式调用

  1. new Promise((resolve, reject) => {
  2. ajax('static/a.json', res => {
  3. console.log(res)
  4. resolve()
  5. })
  6. }).then(res => {
  7. console.log('a成功')
  8. return new Promise((resolve, reject) => {
  9. ajax('static/b.json', res => {
  10. console.log(res)
  11. resolve()
  12. })
  13. })
  14. }).then(res => {
  15. console.log('b成功')
  16. return new Promise((resolve, reject) => {
  17. ajax('static/c.json', res => {
  18. console.log(res)
  19. resolve()
  20. })
  21. })
  22. }).then(res => {
  23. console.log('c成功')
  24. })

console的打印结果依次是:
image.png

代码的初步优化

  1. function getPromise(url) {
  2. return new Promise((resolve, reject) => {
  3. ajax(url, res => {
  4. resolve(res)
  5. })
  6. });
  7. }
  8. getPromise('static/a.json')
  9. .then(res => {
  10. console.log(res)
  11. return getPromise('static/b.json')
  12. })
  13. .then(res => {
  14. console.log(res)
  15. return getPromise('static/c.json')
  16. })
  17. .then(res => {
  18. console.log(res)
  19. });

image.png
代码简洁了很多,并且可读性增强了。避免回调地狱的出现

为何要将 getPromise() 进行 return处理, 因为getPromise()方法返回的是一个promise对象,如果不return,就会默认返回一个 空的 Promise对象,打印的时候会输出undefined

Promise的错误处理catch

  1. getPromise('static/aa.json')
  2. .then(res => {
  3. console.log(res)
  4. return getPromise('static/b.json')
  5. })
  6. .then(res => {
  7. console.log(res)
  8. return getPromise('static/c.json')
  9. })
  10. .then(res => {
  11. console.log(res)
  12. })
  13. .catch(err => {
  14. console.log(err)
  15. })

image.png
因为static/aa.json 文件不存在,所以promise是无法执行下去,会报错,利用catch捕获报错,直接停止运行后面的promise函数
catch可以看做是 promise 的错误 统一处理

最终处理finally

可以用finally来处理弹出框的销毁
promise请求不管成功还是失败,之后都会执行finally方法

  1. new Promise((resolve, reject) => {
  2. setTimeout(() => {
  3. resolve('success')
  4. // reject('fail')
  5. }, 1000)
  6. }).then(res => {
  7. console.log(res)
  8. }).catch(err => {
  9. console.log(err)
  10. }).finally(() => {
  11. console.log('finally')
  12. });

image.png