0%

promise解决了什么问题

promise解决了什么问题?

主要是回调嵌套和控制反转

回调嵌套

嵌套和缩进只是格式层面的问题,深层次问题是代码难以复用、堆栈信息断开、引用外层变量

  • 代码难以复用

    回调中引用了外层变量,提取出来后需要进行相应修改

  • 堆栈信息断开

    异步回调函数执行时将回调函数放入任务队列中,代码继续执行,直到主线程完成,然后才会从任务队列中选择已经完成的任务放入执行栈中,如果回调报错,无法获取调用该异步操作时的栈中的信息,不容易判定哪里出现了错误。

  • 借助外层变量

    多个异步计算同时进行,由于无法预期完成顺序,必须借助外层作用域的变量,可能被其它同一作用域的函数访问并且修改,容易造成误操作。

控制反转

使用第三方api,回调函数的执行次数、是否执行、执行时机都取决于第三方库的实现

  1. 回调函数执行多次 ===> promise只能resolve一次
  2. 回调函数没有执行 ===> 使用Promise.race判断
  3. 回调函数有时同步执行有时异步执行 ===> promise总是异步的

async await的问题

场景一:组合多个promsie

await关键字是串行的,想要同时获取多个promise的结果,需要用promise的api进行处理,比如promise.all

场景二:存储promsie的值

async/await 是语法,不是值,因此它不能被存储和传递。而 promise 对象,可以存储在内存里,可以作为参数在函数中传递。

image.png

建立url到promise映射,通过async/await语法隐藏了promise对象,顶多建立url到result的缓存,但是当页面上发出get请求,结果未抵达,但是又触发了多个相同请求的话就无法命中result缓存,如果缓存的是promise的对象,就可以将同一个promise返回,利用promise对象可以多次调用then方法的特性,让所有相同的get请求获得同一个异步请求结果。