为什么要使用 async & await 而不是 Promise 类?

2025-06-07

为什么要使用 async & await 而不是 Promise 类?

为了回答这个问题,我们首先应该说说什么是承诺以及承诺的作用是什么。

什么是承诺

Promise 是一种编写异步代码的方式,这意味着一个函数将在未来的某个时间返回一些数据,并且代码将继续执行。例如,假设我们饿了,想做一个汉堡。那么我们会先把肉放到炉子上烤,同时切蔬菜。肉烤好后,我们把它从热盘上取下来,放入汉堡中,然后放入蔬菜,一切就绪了。烤肉就是 Promise,烤好后我们会用它做一些事情,这就是我们所说的异步编程。

用法

这是一个简单的函数,用于获取和加载数据。Promise 类提供了两种实现方式,其中 .then 表示 Promise 已结束,.catch 表示发生错误。

const makeRequest = () => {
    getUserData
        .then(user => {
            console.log(user);
        });
}
const makeRequest = async () => {
   console.log(await getUserData());
}

我们看到,使用async 和 await可以减少代码量,但这样,当只有一个函数时,使用 await 还是 promise 类都无所谓。但如果有两个或多个相互依赖的函数,会发生什么情况呢?例如,我们首先想获取一个用户,然后想获取该用户加入的所有俱乐部。以下是两种实现方式。

const makeRequest = () => {
    getUserData
        .then(user => {
            getClubsForUser(user.id)
                .then(clubs => {
                    console.log(clubs);
                }).catch(err => {
                console.log(err.message);
            })
        }).catch(err => {
        console.log(err.message);
    })
};
const makeRequest = async () => {
    try {
        let user = await getUserData();
        let clubs = await getClubsForUser(user.id);
        console.log(clubs);
    }
    catch(err) {
        console.log(err.message);
    }
};

第一个例子会让你头疼。很容易迷失在嵌套的括号中。你可以在第二个例子中看到,使用async & await的代码更清晰易读。而且,我们还要处理回调地狱。async & await是编写异步代码的语法糖。它使代码看起来和行为更像同步代码,但仍然是异步的。

结论

有些人可能会说,使用async & await可以让异步代码不那么明显。但 C# 早就有这个功能了,熟悉它的人都知道,这点暂时的不便还是值得的。

文章来源:https://dev.to/svetloslav15/why-to-use-async-await-instead-of-the-promise-class-4can
PREV
面向开发者的 Arch Linux
NEXT
在 VSCODE 中更改光标动画