首页 > 试题广场 >

请问以下JS代码输出的结果是() const p = Pro

[单选题]
请问以下JS代码输出的结果是()
const p = Promise.resolve(935);
p.then((val) => {
    return val;
}).then((val) => {
    console.log(val);
    return new Promise((res, rej) => {
        res(++val);
    });
}).then((val) => {
    console.log(val);
    return new Promise((res, rej) => {
        setTimeout(() => {
            res(++val);
        }, 1000);
    });
}).then((val) => {
    console.log(val);
});
  • 935、936、936
  • 935、936、937
  • 935、935、935
  • 935、935、936
### 代码回顾 ```js const p = Promise.resolve(935); p.then(val => { // ① return val; // 把 935 原封不动地传下去 }).then(val => { // ② console.log(val); // => 935 return new Promise(res => { // 返回一个新的 Promise res(++val); // 先自增,再同步 resolve → 936 }); }).then(val => { // ③ console.log(val); // => 936 return new Promise(res => { // 再返回一个 Promise setTimeout(() => { res(++val); // 1 秒后再自增 → 937 }, 1000); }); }).then(val => { // ④ console.log(val); // => 937 }); ``` --- ### 执行顺序 & 输出值 1. **p.then ①** * `val` 初始是 **935**。 * `return val;` 直接把 **935** 作为 fulfilled 值传递给下一个 `then`。 2. **then ②**(同步微任务) * 此时 `val` 仍是 **935**,先打印 **935**。 * `++val` 前置递增 → `val` 变成 **936**,随后 **同步** `resolve(936)`。 * 因为是同步 `resolve`,下一步的 `then ③` 会被立即排进微任务队列,紧跟着执行。 3. **then ③**(紧接着的微任务) * 接收到的参数就是上一步 resolve 的 **936**,打印 **936**。 * 返回的 Promise 内部用 `setTimeout`,把 `res(++val)`(此时前置递增为 **937**)放进 **宏任务** 队列,等 1 秒后执行。 4. **1 秒后触发 setTimeout → then ④** * `setTimeout` 回调执行,`resolve(937)`;随后触发链上的最后一个 `then`。 * 打印 **937**。 --- ### 为什么不是选项 A? 选项 A 写的是 “935、936、936”。 * 第一次 `console.log` 的确是 **935**; * 但在 `then ②` 里做了自增并 **同步** resolve 了 **936**,因此 `then ③` 得到的就是 **936**; * 下一次再自增后才会得到 **937**。 因此第三个输出不可能还是 **936**。 --- ## 结论 最终打印的顺序是 **935 → 936 → 937**,对应题目选项 **B**。
发表于 2025-06-14 13:13:47 回复(0)