You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何代码中"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是单线程语言,所有代码都在主线程的执行栈里按顺序执行,只有当前执行栈里的任务全部完成,才会去处理任务队列里的异步任务,或者执行后续的同步任务。具体到你的代码,执行流程是这样的:

  1. 先同步执行let i = 1和function getI()的定义,这部分很快完成。
  2. 执行第一个new Promise时,Promise的执行器(executor)函数是同步运行的——也就是说,代码直接进入while(getI() === 1)的循环里。这个循环是无限循环,它会一直占用主线程,不会主动释放执行权。
  3. 后面的i = 2、setTimeout、第二个new Promise这些代码,都属于主线程执行栈里的后续同步任务,但因为while循环死死占着主线程,这些代码根本没机会被执行。
  4. 哪怕第二个Promise里要把i改成4,也因为它的执行器函数没机会运行,i的值永远停留在1,循环永远不会退出,自然不会执行console.log('asd')和resolve()。

简单说:你的while循环是同步的无限循环,直接把主线程卡死了,后面所有代码连运行的机会都没有,i根本不会被修改。

内容的提问来源于stack exchange,提问作者mrBomj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 01:59:59