当前位置: 首页 > article >正文

async在js中是强制同步的意思吗

在 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") 会在 asyncFunctionawait 期间运行。

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")asyncFunctionawait 部分运行时继续执行。


总结

  1. async 不是强制同步的意思。相反,它让函数内部的异步代码更易读、类似同步代码,但不会阻塞主线程。
  2. async 函数总是返回一个 Promise,其结果可以通过 await.then() 处理。
  3. await 只会暂停当前的 async 函数,而不会影响外部的代码执行。

正确理解 asyncawait 可以帮助你编写更清晰、更高效的异步代码。


http://www.kler.cn/a/404668.html

相关文章:

  • 染色质重塑与心衰中的细胞间通讯机制:解读一篇Nature力作
  • wsl虚拟机中的dockers容器访问不了物理主机
  • windows的WSL Ubuntu子系统重置root或其他用户的密码
  • 【分享一个vue指令】鼠标放置提示指令v-tooltip
  • 通过vite+vue3+pinia从0到1搭建一个uniapp应用
  • 【pytorch-04】:线性回归案例(手动构建)
  • 无人机的激光雷达避障系统阐述!
  • vmware虚拟机给创建的centos扩展磁盘步骤
  • 【MySQL实战45讲笔记】基础篇——深入浅出索引(上)
  • 利用代理IP爬取Zillow房产数据
  • 实时多模态 AI 的 N 种新可能丨实时互动和大模型专场@RTE2024回顾
  • C++学习——编译的过程
  • 【软考】系统架构设计师-信息系统基础
  • 1.1 爬虫的一些知识(大模型提供语料)
  • 渗透测试学习笔记—shodan(1)
  • Flink错误:一historyserver无法启动,二存在的文件会报错没有那个文件或目录
  • 乐鑫芯片模组物联网方案,智能设备升级新选择,启明云端乐鑫代理商
  • 2024亚太杯数学建模C题【Development Analyses and Strategies for Pet Industry 】思路详解
  • 面向未来的智能视觉参考设计与汽车架构,思尔芯提供基于Arm技术的创新方案
  • Android Studio2024版本安装环境SDK、Gradle配置
  • 【Node.js】全面解析 Node.js 安全最佳实践:保护您的应用
  • Smartbi Insight V11与OceanBase完成产品兼容互认证
  • 适合二开a的web组态?
  • “无关紧要”的小知识点:“xx Packages Are Looking for Funding”——npm fund命令及运行机制
  • AQS 理解 及不可重入锁实现
  • C++:operator new/delete函数