Promise知识巩固

68 阅读3分钟

这几天在做项目的过程中发现自己其实对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中的错误