这几天在做项目的过程中发现自己其实对promise这个概念有一些不清晰,导致Node端时常感觉自己写的有问题,所以在写完之后准备对以往的知识进行一些巩固,于是来到社区看到了一篇讲的非常好的文章,结合了实战和理论讲解的Promise,还有许多面试题
以下是我在阅读文章的过程中,自己总结的一些规律、仅供我自己记录和未来重复学习参考
1、promise 有三个状态分别为,pending、fulfilled、 rejected
2、promsie中的.then 方法会在所有代码执行完之后在执行,并且如果promise的状态为pending则不执行(promise的状态必须为失败或者成功时才会执行)
实际上是将.then视为微任务,放入了微任务队列
3、在new 一个promise时,就会执行该构造函数中的代码(立即执行)
4、我们很容易就以为看到new Promise()就执行它的第一个参数函数了,其实这是不对的,我们得注意它是不是被包裹在函数当中,如果是的话,只有在函数调用的时候才会执行。
5、setTimout作为一个宏任务被放入宏任务队列(下一个)
代码整体可视为一个宏任务,优先完成宏任务,其次检查宏任务中的微任务队列(.then),最后执行下一个宏任务(setTimeout)
6、当promise的状态改变时,他的.then方法会被推进当前宏任务的微任务队列
7、Promise的状态一经改变就不能再改变。
8、在Promise中,返回任意一个非 promise 的值都会被包裹成 promise 对象,例如return 2会被包装为return Promise.resolve(2)。
9、catch不管被连接到哪里,都能捕获上层未捕捉过的错误
10、Promise可以链式调用,不过promise 每次调用 .then 或者 .catch 都会返回一个新的 promise,从而实现了链式调用, 它并不像一般我们任务的链式调用一样return this。
11、promise 内部状态一经改变,并且有了一个值,那么后续每次调用 .then 或者 .catch 都会直接拿到该值。
12、.then 或 .catch 返回的值不能是 promise 本身,否则会造成死循环。(但返回的值是一个promise)、
13、.then 或者 .catch 的参数期望是函数,传入非函数则会发生值透传。
14、 promise.finally()
.finally()方法不管Promise对象最后的状态如何都会执行
.finally()方法的回调函数不接受任何的参数,也就是说你在.finally()函数中是没法知道Promise最终的状态是resolved还是rejected的
它最终返回的默认会是一个上一次的Promise对象值,不过如果抛出的是一个异常则返回异常的Promise对象。
15、.all()作用是接收一组异步任务,然后并行执行异步任务,并且在所有异步操作执行完后才执行回调。
.race()的作用也是接收一组异步任务,然后并行执行异步任务,只保留取第一个执行完成的异步操作的结果,其他的方法仍在执行,不过执行结果会被抛弃。
有一个场景是很适合用这个的,一些游戏类的素材比较多的应用,打开网页时,预先加载需要用到的各种资源如图片、flash以及各种静态文件。所有的都加载完后,我们再进行页面的初始化。
Async 与Await
你可以理解为紧跟着
await后面的语句相当于放到了Promise中,下一行及之后的语句相当于放在Promise.then中。
await中的内容如果没有返回值或者可以理解为无法判断该promise的状态,则会一直等待下去,即await后面的语句将不会被执行,与promise后面的.then不会被执行一样 想要解决这个问题,可以使用try catch捕获await中的错误