2026前端面试题(二)

注意以下术语,成功表示resolve,失败表示reject

每个 Promise 对象都有且仅有三种状态

状态 含义 触发方式
Pending(待定) 初始状态,操作尚未完成 创建 Promise 时
Fulfilled(已成功) 操作成功完成 调用 resolve()
Rejected(已失败) 操作失败 调用 reject()

重要特性:Promise 一旦从 Pending 变为 Fulfilled 或 Rejected,状态就不可再改变。

链式操作

  • 情况一

    function step1() {
    return new Promise(resolve => {
    setTimeout(() => {
    console.log("步骤 1 完成");
    resolve(10); // 传递数据给下一步
    }, 1000);
    });
    }

    function step2(value) {
    return new Promise(resolve => {
    setTimeout(() => {
    console.log("步骤 2 收到:", value);
    resolve(value * 2); // 10 * 2 = 20
    }, 1000);
    });
    }

    function step3(value) {
    return new Promise(resolve => {
    setTimeout(() => {
    console.log("步骤 3 收到:", value);
    resolve(value + 5); // 20 + 5 = 25
    }, 1000);
    });
    }

    // 链式调用,清晰优雅
    step1()
    .then(result => step2(result))
    .then(result => step3(result))
    .then(finalResult => {
    console.log("最终结果:", finalResult); // 输出: 最终结果: 25
    })
    .catch(err => {
    // 链中任何一步出错,都会在这里捕获
    console.error("某一步出错了:", err);
    });

结果:步骤 1 完成

步骤 2 收到: 10

步骤 3 收到: 20

最终结果: 25

  • 情况二

    function step1() {
    return new Promise((resolve,rej) => {
    setTimeout(() => {
    console.log("步骤 1 完成");
    rej(10); // 传递数据给下一步
    }, 1000);
    });
    }

    function step2(value) {
    return new Promise(resolve => {
    setTimeout(() => {
    console.log("步骤 2 收到:", value);
    resolve(value * 2); // 10 * 2 = 20
    }, 1000);
    });
    }

    function step3(value) {
    return new Promise(resolve => {
    setTimeout(() => {
    console.log("步骤 3 收到:", value);
    resolve(value + 5); // 20 + 5 = 25
    }, 1000);
    });
    }

    // 链式调用,清晰优雅
    step1()
    .then(result => step2(result))
    .then(result => step3(result))
    .then(finalResult => {
    console.log("最终结果:", finalResult); // 输出: 最终结果: 25
    })
    .catch(err => {
    // 链中任何一步出错,都会在这里捕获
    console.error("某一步出错了:", err);
    });

结果:步骤 1 完成

某一步出错了: 10

ps:只要一步出错,后面所有的then都不会执行

Promise.all

全部成功才算成功,才会执行then

Promise.allSettled

复制代码
const promises = [
 Promise.resolve("成功 A"),
 Promise.reject("失败 B"),
 Promise.resolve("成功 C")
];

Promise.allSettled(promises)
 .then(results => {
   console.log(results);
   // 输出:
   // [
   //   { status: 'fulfilled', value: '成功 A' },
   //   { status: 'rejected', reason: '失败 B' },
   //   { status: 'fulfilled', value: '成功 C' }
   // ]
 });

注意这里即使有一个失败也会执行then,可以跟promise.all对比一下

Promise.race

返回最先完成的那个 Promise 的结果(无论成功或失败)

Promise.any

返回首个成功的 Promise,注意Promise.race返回的是首个完成

async / await 语法糖

让异步代码看起来更像同步代码

相关推荐
宿6743 小时前
tsconfig.node.json
前端·javascript·vue.js
小杨互联网3 小时前
Cursor 前端 Dist 自动化逆向框架:/fr 流水线 · 4 脚本 · Vite/Webpack
前端·webpack·自动化·前端逆向框架·ai前端逆向框架
瑞码空间4 小时前
Web应用的多端部署之道:浏览器 · Electron · Docker
前端·docker·electron·浏览器·web
徐奥雯XUAOWEN4 小时前
Codex官网前端可抄吗?从技术视角深度解析与借鉴指南
前端
文艺理科生4 小时前
3 年,8 种方案,1 次重构:LangChain 记忆方案如何从混乱走向清晰
前端·后端·架构
huabuyu4 小时前
SourceMap:从「看不懂线上报错」到「让 AI 定位真根因」
前端·javascript
এ慕ོ冬℘゜4 小时前
前端树形二级列表渲染 + 页面传参完整实战解析(附原生jQuery源码)
前端·javascript·jquery
weixin_469273815 小时前
.md文件是什么?.md如何打开?
前端·编辑器
不好听6135 小时前
Web Worker:浏览器给 JS 开的后台子线程
前端·浏览器