为何代码中"asd"无法打印且Promise永不resolve?求解析机制
问题解析:为什么代码卡在while循环中?
先看你的代码:
let i = 1; function getI() { return i; } new Promise( resolve => { while(getI() === 1) { } console.log('asd'); resolve(); }) i = 2; setTimeout(() => i = 3, 1500); new Promise(resolve => { i = 4; resolve(); })
核心原因:JavaScript单线程特性 + 同步任务阻塞主线程
JavaScript是单线程语言,所有代码都在主线程的执行栈里按顺序执行,只有当前执行栈里的任务全部完成,才会去处理任务队列里的异步任务,或者执行后续的同步任务。具体到你的代码,执行流程是这样的:
- 先同步执行
let i = 1和function getI()的定义,这部分很快完成。 - 执行第一个
new Promise时,Promise的执行器(executor)函数是同步运行的——也就是说,代码直接进入while(getI() === 1)的循环里。这个循环是无限循环,它会一直占用主线程,不会主动释放执行权。 - 后面的
i = 2、setTimeout、第二个new Promise这些代码,都属于主线程执行栈里的后续同步任务,但因为while循环死死占着主线程,这些代码根本没机会被执行。 - 哪怕第二个Promise里要把
i改成4,也因为它的执行器函数没机会运行,i的值永远停留在1,循环永远不会退出,自然不会执行console.log('asd')和resolve()。
简单说:你的while循环是同步的无限循环,直接把主线程卡死了,后面所有代码连运行的机会都没有,i根本不会被修改。
内容的提问来源于stack exchange,提问作者mrBomj
相关产品推荐
相关产品推荐

