2020.12.23日刚立的flag,每日一题,题目类型不限制,可以是:算法题,面试题,阐述题等等。
往期「每日一题」:
第2道「[每日一题]ES6中为什么要使用Symbol?」(https://mp.weixin.qq.com/s/omeVJdtabo5MeN3DItDfWg)
第1道「一道面试题是如何引发深层次的灵魂拷问?」(https://mp.weixin.qq.com/s/O8j9gM5tD5rjLz1kdda3LA)
接下来是第3道:谈谈你对 promise 的理解?
二、谈谈你对 promise 的理解? 1、我们简单概括一下promisePromise 是 ES6 新增的语法,解决了回调地狱的问题。
无论是ES6的Promise也好,jQuery的Promise也好,不同的库有不同的实现,但是大家遵循的都是同一套规范,所以,Promise并不指特定的某个实现,它是一种规范,是一套处理JavaScript异步的机制。
Promise 本质上就是一个绑定了回调的对象,而不是将回调传回函数内部。
所以,Promise在一定程度上解决了回调函数的书写结构问题,但回调函数依然在主流程上存在,只不过都放到了then(...)里面,和我们大脑顺序线性的思维逻辑还是有出入的。
2、我们说一下promise相关规范
可以把 Promise 看成一个状态机。初始是 pending 状态,可以通过函数 resolve 和 reject ,将状态转变为 resolved 或者 rejected 状态,状态一旦改变就不能再次变化。
then 函数会返回一个 Promise 实例,并且该返回值是一个新的实例而不是之前的实例。因为 Promise 规范规定除了 pending 状态,其他状态是不可以改变的,如果返回的是一个相同实例的话,多个 then 调用就失去意义了。
then 方法可以被同一个 promise 调用多次。
值穿透
三、promise 是如何实现的? 1、Promise的简单使用我们通过这种使用构建Promise实现的最初版本
2、Promise的大致框架大致框架有了,但是Promise状态,resolve函数,reject函数,以及then等回调没有详细处理
3、Promise的链式存储我们先看一个例子:
每间隔1秒打印一个数字,哈哈,这个不是真实的间隔1秒,汪汪,
这个的输出是啥?
打印顺序:1、2、3
这里我们能确认的是:
让a,b,c的只能在then的回调接收到
在连续的异步调用中,如何保证异步函数的执行顺序
Promise一个常见的需求就是连续执行两个或者多个异步操作,这种情况下,每一个后来的操作都在前面的操作执行成功之后,带着上一步操作所返回的结果开始执行。这里用setTimeout来处理.
4、Promise的状态机制和执行顺序为了保证Promise的异步操作时的顺序执行,这里给Promise加上状态机制
5、Promise的递归执行每个Promise后面链接一个对象,该对象包含onresolved,onrejected,子promise三个属性.
当父Promise 状态改变完毕,执行完相应的onresolved/onrejected的时候,拿到子promise,在等待这个子promise状态改变,在执行相应的onresolved/onrejected。依次循环直到当前promise没有子promise。
6、Promise的异常处理每个Promise后面链接一个对象,该对象包含onresolved,onrejected,子promise三个属性.
当父Promise 状态改变完毕,执行完相应的onresolved/onrejected的时候,拿到子promise,在等待这个子promise状态改变,在执行相应的onresolved/onrejected。依次循环直到当前promise没有子promise。
7、Promise的then的实现then 方法是 Promise 的核心,这里做一下详细介绍。
promise.then(onFulfilled, onRejected)一个 Promise 的then接受两个参数: onFulfilled和onRejected(都是可选参数,并且为函数,若不是函数将被忽略)
onFulfilled 特性: