promise 有几种状态 async/await 和promise 有什么关系

  • Promise 是异步编程的底层容器,有三种状态,解决了"回调地狱"但链式调用依然冗长。
  • async/await 是 Promise 的语法糖,让异步代码拥有同步的写法,极大地提高了代码的可读性和维护性,但在处理并行任务时仍需依赖 Promise.all 等方法。

一、 Promise 有几种状态?

这是一个基础但必须回答精准的问题。Promise 对象代表一个异步操作,有三种状态:

  1. Pending(进行中) :初始状态,既没有被兑现,也没有被拒绝。
  2. Fulfilled(已成功) :意味着操作成功完成。
  3. Rejected(已失败) :意味着操作失败。
  • 状态不可逆:状态一旦改变,就不会再变。

    • 只能从 Pending 变为 Fulfilled
    • 或者从 Pending 变为 Rejected
    • 一旦变成 FulfilledRejected,状态就凝固了,之后再调用 resolvereject 都不会再有反应。

二、 async/await 和 Promise 有什么关系?

async/awaitPromise 的语法糖(Syntactic Sugar)。它建立在 Promise 之上,是为了解决 Promise 的"链式调用"造成的代码可读性问题而生的。

具体关系可以从以下三个维度理解:

1. async 函数返回 Promise

async 关键字修饰的函数,无论内部返回什么值,它总是返回一个 Promise 对象

  • 如果返回一个普通值,Promise 状态变为 fulfilled,值为该值。
  • 如果内部抛出异常,Promise 状态变为 rejected
javascript 复制代码
async function test() {
    return 123; // 相当于 return Promise.resolve(123)
}

console.log(test() instanceof Promise); // true
test().then(res => console.log(res)); // 123

2. await 等待 Promise 解决

await 关键字后面通常跟一个 Promise 对象(如果不是,会被转成 resolve 的 Promise)。
它的作用是"暂停"函数执行 ,直到后面的 Promise 状态变为 fulfilled,然后拿到结果继续执行。如果 Promise 变为 rejected,则会抛出错误。

这就把"异步代码"写成了"同步风格":

  • Promise 写法(链式调用):
javascript 复制代码
    function getData() {
        axios.get('/api/user')
            .then(res => {
                console.log(res);
                return axios.get('/api/order'); // 链式调用,容易写成回调地狱
            })
            .then(res => {
                console.log(res);
            })
            .catch(err => {
                console.error(err);
            });
    }
  • async/await 写法(同步风格):
vbnet 复制代码
    async function getData() {
        try {
            const user = await axios.get('/api/user'); // 看起来像同步代码
            console.log(user);
            const order = await axios.get('/api/order');
            console.log(order);
        } catch (err) {
            console.error(err); // 错误处理也更像同步的 try/catch
        }
    }

3. 错误处理的区别

  • Promise 使用 .catch() 方法捕获错误。
  • async/await 通常配合 try...catch 语句捕获错误。这让异步代码的错误处理逻辑与同步代码保持一致,代码结构更清晰。

注:1. async/await 并不能替代 Promise:await 必须等待 Promise 的结果,没有 Promise 就没有 await;- async/await 的写法容易让人忽略"并行"的场景。 如果两个请求没有依赖关系,用 await 写成顺序执行会浪费时间

相关推荐
大黄说说13 分钟前
HTML5语义化标签:从div到article与section的进化之路
前端·html·html5
帅小伙―苏14 分钟前
力扣42接雨水
前端·算法·leetcode
糯米团子74920 分钟前
react速通-2
前端·react.js·前端框架
心连欣28 分钟前
从静态页面到动态交互:DOM操作的核心API解析
前端·javascript·api
橙某人31 分钟前
SSR页面上的按钮点不了?Nuxt 懒加载水合揭秘💧
前端·vue.js·nuxt.js
PursuitofHappiness39 分钟前
2 tree-cli 的使用方法
前端
不做超级小白42 分钟前
把图片压小,但不糊:reduceUrImgs项目关键点拆解
前端·开源·node.js
耀耀切克闹灬44 分钟前
Eruda 移动端调试工具使用指南
前端
王二端茶倒水1 小时前
现在AI Agent 已经能够代替程序员的工作了,作为一个程序员的我该如何规划以后的职业,请认真思考后给我最靠谱可行的建议。
前端·后端·面试
CyrusCJA1 小时前
毛玻璃效果
前端·css·css3