第 130 题:输出以下代码执行结果,大致时间就好(不同于上题)
function wait() { return new Promise(resolve => setTimeout(resolve, 10 * 1000) ) } async function main() { console.time(); await wait(); await wait(); await wait(); console.timeEnd(); } main();
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

上一篇: 第 131 题:接口如何防刷?
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
function wait() {
return new Promise(resolve =>
setTimeout(resolve, 10 * 1000)
)
}
async function main() {
console.time();
let a = wait();
let b = wait();
let c = wait();
await a;
await b;
await c;
console.timeEnd();
}
main();
这个怎么解释???
30s多一点,因为js执行不会立刻执行setTimeout,而是有等待其他代码的执行。
这道题可以这样看执行顺序和每一步消耗的时间:
打印的结果为:
A:: 10002.716064453125ms
B:: 10005.09814453125ms
C:: 10004.77197265625ms
ALL:: 30013.97412109375ms
先说结果,大概30秒多点,30秒是因为每个等待10秒,同步执行。
其实还有一个变种:
这个的运行时间是10s多一点,这是因为:a,b,c的异步请求会按顺序发起。而这个过程是不需要互相依赖等待的。等到wait的时候,其实是比较那个异步耗时最多。就会等待最长。最长的耗时就是整体的耗时。
如果在业务中,两个异步没有依赖关系。应该是后面这种写法。
30s多一点
调用wait函数时加上了await修饰符,导致主流程的执行必须要等待wait函数执行完才会陆续执行后续函数,相当于
await wait() => promise -> wait() -> resolve()
。但是wait函数本身又写了一个promise,整个promise会setTimeout才resolve,相当于本身
wait函数 => promise -> setTimeout(resolve)
。那么整个串起来,流程有点类似下面这样子,promise的嵌套,只有等内部wait函数的promise -> resolve之后,才会将外部的promise -> resolve掉。然后再去执行下一个wait函数。
main -> wait -> promise -> (promise -> setTimeout(resolve))(resolve)
为啥要30s多一点,额,写入微任务队列,微任务队列里再写入任务队列,都是需要时间。
30s多点
30s