提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
一、promise是什么?
- 异步编程
- 语法上:构造函数
- 功能上:封装一个异步操作并获取其结果
二、promise相对于纯回调函数的好处
- 指定回调函数的方式更加灵活。纯回调函数必须在启动异步任务之前指定。promise:启动异步任务---->返回promise对象---->给promise对象绑定回调函数(甚至可以在异步任务结束后指定)
- 支持链式调用,解决回调地狱问题。回调地狱:回调函数的嵌套,外部回调函数异步执行的结果是内部嵌套回调函数执行的条件,回调地狱的写法不便于代码阅读,可以用promise链式调用解决,终极解决方法为async/await。
三、promise执行过程
四、改变promise状态和指定回调函数谁先谁后
-
都有可能,正常情况下先指定回调函数再改变状态,但也可先改变状态再指定回调
-
如何先改变状态再执行回调?
a:在执行器中直接调用resolve()/reject()
b:延迟根长时间再调用then() -
什么时候得到数据?
a:如果先指定回调,那当状态改变时,回调函数就会调用,得到数据
b:当状态先改变时,当指定回调,回调函数就会调用,得到数据
五、promise.then()返回的新的promise的结果状态怎样确定?
- 由then()指定的回调函数执行的结果决定
- 如果抛出异常,新promise变为rejected,reason为抛出的异常
- 如果返回的是非promise的任意值,新promise变为resolved,balue为返回的值
- 如果返回的是另一个新promise,此promise的结果就会成为新promise的结果
六、promise如何串联多个操作任务
- promsie的then()返回一个新的promsie,可以看成then的链式调用
- 通过then()的链式调用可以串联多个同步/异步任务
七、promsie的异常传透
- 当使用promsie的链式调用时,可以在最后指定失败的回调
- 当前面任何操作除了异常,都会传到最后失败的回调中处理
八、怎样中断promise链
- 在回调函数中返回一个pending状态的promise对象
九、async函数
- 函数的返回值为promise对象
- promise对象的结果由async函数执行的返回值决定
十、await表达式
- await右侧的表达式一般为promise对象,但也可以是其它的值
- 表达式是promise对象,await返回的是promise成功的值
- 表达式是其他值,直接将此值作为await的返回值。
await必须直接写在async函数中,但async函数可以没有await
如果await的promise失败了,就会抛出异常,需要通过try…catch来捕获处理