JavaScript 中 async/await 有没有必要彻底搞懂?

2024-04-25 18:18:18 +08:00
 shendaowu
花了两天时间把相关的东西看了个大概。然后感觉跟着例子照猫画虎应该没什么大问题了,但是自己独立写很可能会有问题。感觉理解得还不是很透彻。这种不透彻是否会导致出现什么严重的问题?我是主要看的这个: https://zh.javascript.info/async 。另外还看了一些其他相关的章节。
5790 次点击
所在节点    JavaScript
45 条回复
zhouS9
2024-04-26 15:26:31 +08:00
await/async 解决了 promise 的问题,但是我喜欢用 promise ,因为他解决了 callback 的问题
ynyjyz
2024-04-26 15:49:01 +08:00
Promise 、async 和 await 是 JavaScript 语言中处理异步操作的三个重要概念。下面我将分别解释它们的含义和用法:

Promise
Promise 是一种用于异步计算的对象。它代表了一个可能现在还没有结果,但将来会有结果的值。一个 Promise 对象有三种状态:

Pending (进行中):初始状态,既不是成功,也不是失败状态。
Fulfilled (已成功):操作成功完成。
Rejected (已失败):操作失败。
const myPromise = new Promise((resolve, reject) => {
// 异步操作
const condition = true; // 假设这是异步操作的结果
if (condition) {
resolve('Promise is resolved successfully.');
} else {
reject('Promise is rejected.');
}
});

myPromise.then((value) => {
console.log(value); // 如果成功,将打印 'Promise is resolved successfully.'
}).catch((error) => {
console.error(error); // 如果失败,将打印 'Promise is rejected.'
});
async/await
async 和 await 是基于 Promise 的语法糖,它们使得异步代码的编写和同步代码一样直观。

async:用于声明一个函数是异步的。这意味着函数内部可能会执行一个或多个异步操作,并且函数返回的是一个 Promise 对象。
await:用于等待一个 Promise 对象的结果。它只能在 async 函数内部使用。
async function asyncFunction() {
try {
const result = await myPromise; // 等待 myPromise 的结果
console.log(result); // 'Promise is resolved successfully.'
} catch (error) {
console.error(error); // 'Promise is rejected.'
}
}

asyncFunction();
使用 async 和 await 可以避免所谓的“回调地狱”,并使异步代码的逻辑更加清晰。

区别和联系
Promise 是一种异步操作的模式,async/await 是基于 Promise 的更简洁的语法。
async 函数返回一个 Promise ,await 使得你可以暂停 async 函数的执行,等待 Promise 的解决。
Promise 需要使用 .then() 和 .catch() 来处理结果和错误,而 async/await 使用 try/catch 来处理。
这些概念是现代 JavaScript 异步编程的基础,它们允许开发者以一种更接近同步编程的方式来处理异步任务。
fpure
2024-04-26 23:22:24 +08:00
@yor1g 不一样的,光有 Promise 不能实现 async/await 语法,还需要 generator 。应该说在这个结构里,generator 比 Promise 重要,比如 rust 里面用的就是基于轮询的 Future 而非基于回调的 Promise
R1hu6Hs2sSN8pkVX
2024-05-15 14:56:35 +08:00
当你知道在没有 promise 前用什么样的方式实现异步/发送请求你就能明白他的意义
raydied
2024-05-22 14:14:16 +08:00
我觉得 go 好难。不过那天在看慕课网 go 开发工程师教程的时候,有了对 js 的 async 的理解。
简单地说,不知道对不对( chatgpt 说基本正确)。
因为 js 是异步(基于事件循环的异步编程模型)的,非阻塞的,等待请求时可以做其他事情。
但有些时候需要阻塞的,同步的。如,某些情况要求等待请求回来之后,再进行逻辑计算——这时候就需要有顺序的,一步一步的,即阻塞的。
如何把非阻塞(异步)改成阻塞(同步)的,需要一个标记,async ,告诉把谁改成了同步的。
和谁是阻塞关系?又需要一个标记,await 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1035698

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX