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 写成顺序执行会浪费时间

相关推荐
han_2 小时前
JavaScript设计模式(四):发布-订阅模式实现与应用
前端·javascript·设计模式
27669582922 小时前
租车帮(悟空)订单查询算法分析
java·服务器·前端·悟空·悟空app·租车帮·租车帮逆向
__雨夜星辰__2 小时前
TypeScript 入门学习笔记(面向对象 + 常用设计模式)
前端·学习·typescript
晚霞的不甘2 小时前
HarmonyOS ArkTS 进阶实战:深入理解边距、边框与嵌套布局
前端·计算机视觉·华为·智能手机·harmonyos
_野猪佩奇_牛马版2 小时前
ReACT Agent 开发知识点总结
前端
牛奶2 小时前
你发送的消息,微信到底怎么送到的?
前端·websocket·http
酉鬼女又兒2 小时前
零基础快速入门前端DOM 元素获取方法详解:从代码到实践(可用于备赛蓝桥杯Web应用开发)
前端·javascript·职场和发展·蓝桥杯·js
牛奶2 小时前
为什么关掉浏览器再打开,你还是登录状态?
前端·网络协议·https
bjxiaxueliang2 小时前
一文掌握Python aiohttp:异步Web开发从入门到部署
开发语言·前端·python