在 JavaScript 中,async
并不是“强制同步”的意思,而是表示一个函数是异步的。具体来说:
1. async
的定义
async
是用来标记一个函数为 异步函数 的关键字。- 异步函数的返回值是一个
Promise
对象。 - 函数内的
await
关键字可以暂停代码的执行,直到Promise
被解决(resolved 或 rejected)。
示例:
async function example() {
return "Hello!";
}
example().then(console.log); // 输出: "Hello!"
在这个例子中,虽然 example
函数看起来像是立即返回,但实际上它返回了一个 Promise
,内部值为 "Hello!"
。
2. async
并不是“强制同步”
async
的行为并不会强制让代码同步运行,反而它让代码可以以异步的方式执行。
示例:
async function asyncFunction() {
console.log("Inside async function");
await new Promise(resolve => setTimeout(resolve, 1000));
console.log("After await");
}
console.log("Before calling asyncFunction");
asyncFunction();
console.log("After calling asyncFunction");
输出:
Before calling asyncFunction
Inside async function
After calling asyncFunction
After await
分析:
asyncFunction
中的await
让代码暂停了 1 秒钟,但外部代码不会被阻塞。- 外部的
console.log("After calling asyncFunction")
会在asyncFunction
的await
期间运行。
3. 为什么有些人误解为“强制同步”
可能的误解来源是 await
的作用。await
会暂停异步函数的执行,直到等待的 Promise
解析。这可能让人觉得它像同步代码一样,按顺序执行。
示例:
async function fetchData() {
console.log("Fetching data...");
const result = await new Promise(resolve => setTimeout(() => resolve("Data"), 1000));
console.log("Data received:", result);
}
fetchData();
输出:
Fetching data...
(Data received: Data) // 1 秒后
这里看起来像是代码被暂停了,但实际上只是 fetchData
的内部暂停,外部的 JavaScript 主线程仍然是继续运行的。
4. 真正的同步与 async
的对比
同步代码(阻塞)
function syncFunction() {
console.log("Start");
for (let i = 0; i < 1e9; i++) {} // 模拟耗时操作
console.log("End");
}
console.log("Before");
syncFunction();
console.log("After");
输出:
Before
Start
End
After
同步代码会阻塞整个线程,导致 console.log("After")
必须等 syncFunction
完全运行后才能执行。
async
代码(非阻塞)
async function asyncFunction() {
console.log("Start");
await new Promise(resolve => setTimeout(resolve, 1000)); // 模拟耗时操作
console.log("End");
}
console.log("Before");
asyncFunction();
console.log("After");
输出:
Before
Start
After
End // 1 秒后
异步代码不会阻塞主线程,因此 console.log("After")
在 asyncFunction
的 await
部分运行时继续执行。
总结
async
不是强制同步的意思。相反,它让函数内部的异步代码更易读、类似同步代码,但不会阻塞主线程。async
函数总是返回一个Promise
,其结果可以通过await
或.then()
处理。await
只会暂停当前的async
函数,而不会影响外部的代码执行。
正确理解 async
和 await
可以帮助你编写更清晰、更高效的异步代码。