第 13 题:Promise 构造函数是同步执行还是异步执行,那么 then 方法呢?
const promise = new Promise((resolve, reject) => {
console.log(1)
resolve()
console.log(2)
})
promise.then(() => {
console.log(3)
})
console.log(4)
执行结果是:1243,promise 构造函数是同步执行的,then 方法是异步执行的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(38)
根据上面的回答,总结下应该是then函数本身是同步,then里面的cb是异步
只要好好理解下 Promise, 很多疑问会迎刃而解
抓重点理解Promise
请问在浏览器控制器中执行的时候,打印的3和6之间会有一个“随机数字”,它是怎么出现的,代表的什么呢?
随机数字是
seTimeout
方法的返回值setTimeout()
方法的返回值是一个 **唯一的数值 **如果你想要终止
setTimeout()
方法的执行,那就必须使用clearTimeout()
方法来终止,而使用这个方法的时候,系统必须知道你到底要终止的是哪一个setTimeout()
方法(因为你可能同时调用了好几个setTimeout()
方法),这样clearTimeout()
方法就需要一个参数,这个参数就是setTimeout()
方法的返回值(数值),用这个数值来唯一确定结束哪一个
setTimeout()
方法。promise是微观任务,setTimeout是宏观任务,先执行微观任务,在执行宏观任务;微观任务里,先执行同步再执行异步 所以结果是 124536
promise构造函数肯定是同步执行的,new Promise和其他的什么new Map、new Set一样的都是同步执行,当执行resolve方法将promise状态更新为fulfilled,并返回一个promise对象,调用then就会将then中的回调放入微任务队列中,也就是说promise.then才是异步
严格来说 构造函数 then都是同步的, 只是then内部的这个参数回调函数需要看resolve执行时机 并且内部做了个定时器, 所以回调才是异步的
整体代码、setTimeout、setInterval、Promise构造函数是宏任务,promise的then方法是微任务
假如有这么一段代码
请问为什么输出结果是2,5,1呢?
resolve(1)
之后,不应该是优先注册了外部.then
的回调吗?还是说内部的
Promise
是同步执行的?当然是异步啦,在执行resolve()之前会先将其他语句执行完的
Promise对象,就是将异步操作以同步操作的流程表达出来
我的天。then当然也是同步执行,then方法的参数callback函数才会在then等待状态变化的promise fulfill或者reject后起一个微任务把callback丢进去
这题还不如直接问Promise的原理或写法
更详细一点的说法是等到 promise变为 resolved状态的时候,then注册的回调函数才被放入到微任务队列中,等待调用执行
补段代码
做戏做全套... 写一个更有助于理解
ps: 微任务以宏任务(setTimeout)替代
promise 的构造函数是同步执行的,then方法也是同步执行的,只不过 then 里面的回调函数是异步执行的。
const promise = new Promise(async (resolve, reject) => {
console.log(1)
await resolve()
console.log(2)
})
promise.then(() => {
console.log(3)
})
console.log(4);
碰到过这种扩展,想了解为什么2在3之前执行
这种出现 await 的代码,你可以等价转化为:
也就是将 await 后面跟着的部分用一个
Promise.resolve()
包裹起来,然后剩余部分塞到一个 then 的回调函数里。这样再分析就简单了。严格来说then方法 是同步执行的,then方法的参数(回调函数)是 异步执行的
如何体现呢?能举例说明吗?
之所以then是异步是为了处理循环引用的问题。
判断then里面new的promise 跟successCallback执行后得到的p1是不是同一个promise。
但是then里面处理回调的时候new的promise还没有创建完成。
then()到底是同步执行还是异步执行?为什么回答里有的说是同步有的说是异步
这个题和之前的第8题类似
.then()当然是同步执行,只不过是.then的cb被放入了微任务队列,产生了异步执行
看过 Event Loop 基础原理的就明白,Promise构造函数是同步执行,而 .then .catch .啥啥的是异步(还有process.nextTick等等,大家可以查),
而且放到了微队列中,async/await 中,await 前面的是同步,await 后面的是异步,写法上是这样,但是其实是 语法糖,最后还会转为 Promise.then的形式
Promise 构造函数是同步执行,then 是异步执行。看一下 Promise 的实现就知道了。
Promise必然是同步的。就then我补充一下:
在ES6时代有了微异步的设定,then作为最典型代表,算是异步的一员。
在ES5时代,实现then的方式则要看构造函数里resolve(或reject)的用法了,如果resolve被同步使用,实质上resolve仍然是同步的。
3是在5后面打印出来的啊,第一轮事件循环的时候,microtask queue里面先添加的promise.resolve(5).then((val)=>{console.log(val)}),后添加的promise.then(() => {
console.log(3);
});
请问为什么3在val之前?
excutor执行器里面是同步执行的,then里面是异步操作
Promise new的时候会立即执行里面的代码 then是微任务 会在本次任务执行完的时候执行 setTimeout是宏任务 会在下次任务执行的时候执行
学习了
这里对上面的例子做一个扩展
执行结果: 124536