首先我们来看看MDN中对Promise与setTimeout的定义与解释;
1.Promise
Promise 对象用于表示一个异步操作的最终完成 (或失败)及其结果值。
一个 Promise
对象代表一个在这个 promise 被创建出来时不一定已知的值。它让您能够把异步操作最终的成功返回值或者失败原因和相应的处理程序关联起来, 这样使得异步方法可以像同步方法那样返回值。本质上 Promise 是一个函数返回的对象,我们可以在它上面绑定回调函数,这样我们就不需要在一开始把回调函数作为参数传入这个函数了。
一个 Promise
必然处于以下几种状态之一:
- 待定(pending): 初始状态,既没有被兑现,也没有被拒绝。
- 已兑现(fulfilled): 意味着操作成功完成。
- 已拒绝(rejected): 意味着操作失败。
2.setTimeout
JS中,可以通过setTimeout方法设置一个定时器,规定在定时器延迟指定时间后执行相对应的程序;
常用属性:
function,这
是你想要在到期时间(delay
毫秒)之后执行的函数。
code,
这是一个可选语法,你可以使用字符串而不是function ,在delay
毫秒之后编译和执行字符串 (使用该语法是不推荐的, 原因和使用 eval()一样,有安全风险)。
delay,
延迟的毫秒数 (一秒等于1000毫秒),函数的调用会在该延迟之后发生。如果省略该参数,delay取默认值0,意味着“马上”执行。
二者在执行顺序上的区别;
首先,Promise与setTimeout本质上都是异步操作,前者属于异步微任务(microtask),后者则是异步宏任务(macrotask)。
在JS的编译与执行过程中,当进行到异步操作时,会优先处理微任务,直到所有微任务与同步程序处理完毕才会开始处理宏任务。而与程序中代码的书写顺序无关(即使setTimeout写在Promise前也是如此。)
因此,二者的实际执行顺序是:先执行Promise,后执行setTimeout。