今天面试被问到了两个关于promise的面试题,不外乎就是执行顺序相关的问题,话不多说,先上代码!
这道题相信大家都明白了,一道烂大街的题,输出结果不外乎就是Promise1,1,Promise2,setTimeout
大致说一下原理,首先先了解一句话:同步优先,异步靠边,setTimeout是常用来模仿异步处理的一个方式,当你看到setTimeout的话那就肯定是异步操作,先让他往后稍一稍,接下来就是promise,promise内部是同步的,所以说先打印出Promise1,接下来就是then方法里的console,因为then是异步的,所以也先往后稍一稍,再往下就是最外部的console.log(1)了,这肯定是同步的,所以接下来打印的是1,然后就是这个setTimeout和then里面的先后顺序了,then函数在promise是下一轮执行的,所以接下来打印的就是Promise2,最后输出的是setTimeout。
复制代码
第二道题,我问了很多人,都答得和我一样,都答错了,不知道你们有没有中招。话不多说,上代码。
一开始我想到的就是1,2,3,4,面试官也没说什么,就继续接下来的问题了,其实我知道肯定答错了,所以回来看了一下文档,正确结果是1,2,4,3,原因很简单,当Promise直接resolve的时候,表示着在当前这一轮执行,这里就可以看作成一个同步的事件,所以打印的就是1,2,4,3。
复制代码
说说你对promise对象的理解:
-
promise是异步编程的一种解决方法,从语法上说promise是一个对象,从它可以获取异步操作的消息
-
promise主要作用是:可以把异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,promise对象提供了统一的接口,使得控制异步操作更简单
-
promise对象的特点:
对象状态不受外界影响(公3种pending(进行中),resolved(已完成),reject(已失败))。 只有异步操作的结果可以决定是当前哪一种状态,任何其他操作都无法改变 一旦状态改变就不会再变,任何时候都可以得到这个结果。 promise对象改变只有两种可能:从pending到resolved,从pending到reject
-
promise对象的缺点:
无法取消promise,一旦创建就立即执行,无法中途取消 如果不设置回调函数,promise内部抛出错误,不会反映到外部 当处于pending状态时,无法得知目前进展到那个阶段(刚刚开始还是即将完成)