promise解决了什么问题?
主要是回调嵌套和控制反转
回调嵌套
嵌套和缩进只是格式层面的问题,深层次问题是代码难以复用、堆栈信息断开、引用外层变量
代码难以复用
回调中引用了外层变量,提取出来后需要进行相应修改
堆栈信息断开
异步回调函数执行时将回调函数放入任务队列中,代码继续执行,直到主线程完成,然后才会从任务队列中选择已经完成的任务放入执行栈中,如果回调报错,无法获取调用该异步操作时的栈中的信息,不容易判定哪里出现了错误。
借助外层变量
多个异步计算同时进行,由于无法预期完成顺序,必须借助外层作用域的变量,可能被其它同一作用域的函数访问并且修改,容易造成误操作。
控制反转
使用第三方api,回调函数的执行次数、是否执行、执行时机都取决于第三方库的实现
- 回调函数执行多次 ===> promise只能resolve一次
- 回调函数没有执行 ===> 使用Promise.race判断
- 回调函数有时同步执行有时异步执行 ===> promise总是异步的
async await的问题
场景一:组合多个promsie
await关键字是串行的,想要同时获取多个promise的结果,需要用promise的api进行处理,比如promise.all
场景二:存储promsie的值
async/await 是语法,不是值,因此它不能被存储和传递。而 promise 对象,可以存储在内存里,可以作为参数在函数中传递。
建立url到promise映射,通过async/await语法隐藏了promise对象,顶多建立url到result的缓存,但是当页面上发出get请求,结果未抵达,但是又触发了多个相同请求的话就无法命中result缓存,如果缓存的是promise的对象,就可以将同一个promise返回,利用promise对象可以多次调用then方法的特性,让所有相同的get请求获得同一个异步请求结果。