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 语法糖

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

相关推荐
@大迁世界7 小时前
Firefox 本地模式:localhost 再见了 ?
前端·架构
米米商聊9 小时前
同名附件为什么被 Map 覆盖?重复键与一对多索引
前端·javascript
echome88810 小时前
Python 异常处理:try、else、finally 的正确搭配
开发语言·前端·python·异常处理·编程技巧
时间的情敌11 小时前
OpenLayers 实战|Vue3 + OpenLayers 完整工程案例(加载天地图、要素、弹窗、绘制、WFS)
前端·openlayers
陈随易11 小时前
下载神器!Motrix 停更三年后重写回归
前端·后端·程序员
前端的日常11 小时前
一个人+AI做情侣食谱小程序,0 费用的服务器
前端·后端
计算机魔术师12 小时前
谷歌搜索广告踩刹车,AI广告成为救命稻草
前端
总要学点什么12 小时前
第81篇:数据可视化-PM2.5分布——让圆点的胖瘦替每座城市报出浓度
前端·信息可视化·echarts·cesium·空间分析
IT_陈寒12 小时前
Vue的v-for里用了个临时变量,页面直接挂了
前端·人工智能·后端
hunter_07612 小时前
一次 iOS 真机签名 409 的完整排查:证书、设备、描述文件为什么总是"对不上"
前端