理解 JavaScript 的异步:一杯奶茶和排队的故事

大家好!今天我们聊点轻松的,关于 JavaScript 的异步编程。它听起来很高深,其实呢,就像排队买奶茶那么简单(当然,不包括那些“排队三小时”的网红店 😅)。


为什么要用异步?

想象一下,你在奶茶店点了奶茶,结果服务员告诉你:“你的奶茶需要煮 30 分钟,你得站在这儿等。”
站着等半小时?没事儿还能玩手机,但如果后面还有人排队呢?他们也得等你奶茶煮完,整个店都瘫痪了!

所以,为了不耽误后面的顾客,聪明的奶茶店采用了一个简单的办法:你点单后,拿个号等着,奶茶做好了再叫你。

JavaScript 也是这么干的。它说:

“所有的任务,我一个一个来,但耗时的任务(煮奶茶),可以先放一边,等完成了我再处理它。”

这就是 JavaScript 的异步核心!听起来还不难吧?


异步背后的故事

为了搞懂异步,我们需要认识几个奶茶店的“员工”:

  1. 主线程(Main Thread)
    服务员,负责一个一个处理任务。
  2. 任务队列(Task Queue)
    排队的顾客列表,所有点单的人都会在这里排队。
  3. 异步任务(Async Task)
    像煮奶茶、烧水这种需要时间的事情,会被交给后厨(浏览器或 Node.js 环境)处理。
  4. 事件循环(Event Loop)
    负责调度的店长,确保每件事按顺序处理,不乱套。

一杯奶茶引发的异步任务

我们用代码看看奶茶店的排队流程。

console.log('顾客 1:我想要一杯珍珠奶茶');

setTimeout(() => {
    console.log('奶茶煮好了!');
}, 3000);

console.log('顾客 1:好吧,那我等一会儿。');

输出结果:

顾客 1:我想要一杯珍珠奶茶
顾客 1:好吧,那我等一会儿。
奶茶煮好了!

你会发现,“奶茶煮好了!”最后才打印出来,这是因为煮奶茶的操作是异步的,它被交给后厨处理了,主线程可以继续接待其他顾客。


微任务和宏任务:谁先上?

JavaScript 的异步队列分两种:微任务宏任务。两者有点像“优先级队列”:微任务的优先级更高。

简单点说,微任务更像 VIP 顾客,点了单,店长会立马安排先做好。宏任务则是普通顾客,得排队慢慢来。

代码举例:

console.log('1. 同步任务:顾客点单');

setTimeout(() => {
    console.log('3. 宏任务:顾客拿奶茶');
}, 0);

Promise.resolve().then(() => {
    console.log('2. 微任务:煮珍珠完成');
});

console.log('4. 同步任务:继续接待下一个顾客');

输出顺序:

1. 同步任务:顾客点单
4. 同步任务:继续接待下一个顾客
2. 微任务:煮珍珠完成
3. 宏任务:顾客拿奶茶

看出来了吗?虽然 setTimeout 设置的是 0 毫秒,但微任务的优先级更高,所以 “煮珍珠完成” 比 “顾客拿奶茶” 先输出。


回调、Promise 和 Async/Await:煮奶茶的三种方式

1. 回调:外卖奶茶的祖传手艺

回调是最早的异步方式,你点一杯奶茶,老板说:“奶茶做好了我会喊你。”
但如果奶茶要煮很多配料呢?比如珍珠 -> 布丁 -> 红豆,回调就会变成下面这个样子:

setTimeout(() => {
    console.log('煮珍珠完成');
    setTimeout(() => {
        console.log('加布丁完成');
        setTimeout(() => {
            console.log('加红豆完成');
        }, 1000);
    }, 1000);
}, 1000);

这叫回调地狱,你可以看到嵌套得一层又一层,代码读起来就像迷宫。


2. Promise:让煮奶茶有了合同

Promise 的出现解决了嵌套问题,它像一份合同,承诺奶茶一定会做好,但具体时间未知。

const makeMilkTea = () => {
    return new Promise((resolve, reject) => {
        setTimeout(() => resolve('奶茶完成'), 1000);
    });
};

makeMilkTea()
    .then((result) => {
        console.log(result); // 奶茶完成
        return makeMilkTea(); // 再来一杯
    })
    .then((result) => console.log(result));

Promise 的好处是,任务变得清晰有条理了。但你还是得写 .then(),链式结构稍微有点冗长。


3. Async/Await:现代奶茶店的 VIP 服务

Async/Await 是异步编程的终极武器,它让代码看起来像同步的,但背后仍是异步的。

const makeMilkTea = () => {
    return new Promise((resolve) => {
        setTimeout(() => resolve('奶茶完成'), 1000);
    });
};

const serveMilkTea = async () => {
    console.log('开始煮奶茶');
    const result = await makeMilkTea();
    console.log(result); // 奶茶完成
    console.log('奶茶上桌');
};

serveMilkTea();

代码看起来简洁又优雅,几乎就是“同步写法”的异步执行方式,适合现代奶茶店管理多任务。


总结

JavaScript 的异步机制,真的就像一个奶茶店的排队系统:

  • 调用栈负责处理同步任务。
  • 异步任务交给“后厨”,回头再处理。
  • 微任务优先,宏任务后续跟上。

在日常开发中:

  • 简单任务用 回调
  • 复杂任务用 Promise
  • 想要代码清晰优雅,推荐 Async/Await

希望这篇“奶茶店”的小故事,能帮助更好的理解 JavaScript 的异步核心。如果有任何疑问,欢迎在评论区留言,我们一起交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/923136.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UE5肉鸽游戏教程学习

学习地址推荐:UE5肉鸽项目实战教程_哔哩哔哩_bilibili

反向代理服务器的用途

代理服务器在网络中扮演着重要的角色,它们可以优化流量、保护服务器以及提高安全性。在代理服务器中,反向代理服务器是一种特殊类型,常用于Web服务器前,它具备多种功能,能够确保网络流量的顺畅传输。那么,让…

面试经典 150 题:205,55

205. 同构字符串 【解题思路】 来自大佬Krahets 【参考代码】 class Solution { public:bool isIsomorphic(string s, string t) {map<char, char> Smap, Tmap;for(int i0; i<s.size(); i){char a s[i], b t[i];//map容器存在该字符&#xff0c;且不等于之前映射…

信创改造 - TongRDS 替换 Redis

记得开放 6379 端口哦 1&#xff09;首先在服务器上安装好 TongRDS 2&#xff09;替换 redis 的 host&#xff0c;post&#xff0c;passwd 3&#xff09;TongRDS 兼容 jedis # 例如&#xff1a;更改原先 redis 中对应的 host&#xff0c;post&#xff0c;passwd 改成 TongRDS…

嵌入式工程师面试笔试总结——day1

第一章、进程与线程 1、什么是进程、线程&#xff0c;有什么区别&#xff1f; 进程是资源&#xff08; CPU 、内存等&#xff09;分配的基本单位&#xff0c;线程是 CPU 调度和分配的基本单位&#xff08;程序执行的最小单 位&#xff09;。同一时间&#xff0c;如果CPU 是单…

算法之区间和题目讲解

题干 难度&#xff1a;简单 题目分析 题目要求算出每个指定区间内元素的总和。 然而&#xff0c;区间在输入的最下面&#xff0c;所以按照暴力破解的思路&#xff0c;我们首先要遍历数组&#xff0c;把它的值都存进去。 然后&#xff0c;遍历下面的区间&#xff0c;从索引a…

泷羽sec-linux

基础之linux 声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团…

用 Python 从零开始创建神经网络(十):优化器(Optimizers)(持续更新中...)

优化器&#xff08;Optimizers&#xff09; 引言1. 随机梯度下降/Stochastic Gradient Descent (SGD)2. 学习率&#xff08;Learning Rate&#xff09;3. 学习率衰减&#xff08;Learning Rate Decay&#xff09;4. 带动量的随机梯度下降法&#xff08;Stochastic Gradient Des…

UE5安装教程及设置

学习链接&#xff1a;01-安装UE5及设置_哔哩哔哩_bilibili

如何利用Python爬虫精准获得1688店铺的所有商品信息

在数字化时代&#xff0c;数据的价值日益凸显&#xff0c;尤其是在电商领域。1688作为中国领先的B2B电商平台&#xff0c;拥有丰富的商品数据。对于电商企业来说&#xff0c;获取这些数据对于市场分析、竞品研究等具有重要意义。本文将详细介绍如何使用Python编写爬虫程序&…

电子学习中的关键游戏化元素

游戏化彻底改变了电子学习领域&#xff0c;提供了一种使学习具有吸引力、互动性和有效性的方法。通过将类似游戏的功能集成到教育平台中&#xff0c;教育工作者可以增强动力&#xff0c;提高知识记忆&#xff0c;并创造动态的学习体验。游戏化的关键要素为设计与学习者产生共鸣…

docker镜像、容器、仓库介绍

docker docker介绍docker镜像命令docker容器命令docker仓库 docker介绍 官网 Docker 是一种开源的容器化平台&#xff0c;用于开发、部署和运行应用。它通过将应用程序及其依赖项打包到称为“容器”的单一包中&#xff0c;使得应用能够在任何环境下运行&#xff0c;不受底层系…

一些好的AI技术学习平台和资料(动态更新)

1. 大模型 1.1 提示词&#xff08;Prompt&#xff09; 目前&#xff0c;大模型技术已经深入到工作生活的方方面面&#xff0c;各技术大厂的大模型也层出不穷&#xff0c;从开始的OpenAI一家独大&#xff0c;到当今世界的“百模大战”。从一些日常使用的角度来说&#xff0c;模…

IDEA优雅debug

目录 引言一、断点分类&#x1f384;1.1 行断点1.2 方法断点1.3 属性断点1.4 异常断点1.5 条件断点1.6 源断点1.7 多线程断点1.8 Stream断点 二、调试动作✨三、Debug高级技巧&#x1f389;3.1 watch3.2 设置变量3.3 异常抛出3.4 监控JVM堆大小3.5 数组过滤和筛选 引言 使用ID…

QT简易项目 数据库可视化界面 数据库编程SQLITE QT5.12.3环境 C++实现

案例需求&#xff1a; 完成数据库插入&#xff0c;删除&#xff0c;修改&#xff0c;查看操作。 分为 插入&#xff0c;删除&#xff0c;修改&#xff0c;查看&#xff0c;查询 几个模块。 代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget…

丹摩征文活动|实现Llama3.1大模型的本地部署

文章目录 1.前言2.丹摩的配置3.Llama3.1的本地配置4. 最终界面 丹摩 1.前言 Llama3.1是Meta 公司发布的最新开源大型语言模型&#xff0c;相较于之前的版本&#xff0c;它在规模和功能上实现了显著提升&#xff0c;尤其是最大的 4050亿参数版本&#xff0c;成为开源社区中非常…

MySQL与Informix数据库中的同义表创建:深入解析与比较

MySQL与Informix数据库中的同义表创建:深入解析与比较 一、同义表的基本概念与用途1. 定义与概念2. 主要用途二、MySQL数据库中的同义表创建1. 使用视图创建同义表2. 使用别名创建同义表3. MySQL中的同义表限制与替代方案三、Informix数据库中的同义表创建1. 创建同义表的基本…

【LeetCode面试150】——202快乐数

博客昵称&#xff1a;沈小农学编程 作者简介&#xff1a;一名在读硕士&#xff0c;定期更新相关算法面试题&#xff0c;欢迎关注小弟&#xff01; PS&#xff1a;哈喽&#xff01;各位CSDN的uu们&#xff0c;我是你的小弟沈小农&#xff0c;希望我的文章能帮助到你。欢迎大家在…

鸿蒙进阶篇-状态管理之@Provide与@Consume

大家好&#xff0c;这里是鸿蒙开天组&#xff0c;今天我们来学习一下状态管理中的Provide与Consume。 一、概述 嘿&#xff01;大家还记得这张图吗&#xff1f;不记得也要记得哦&#xff0c;因为这张图里的东西&#xff0c;既是高频必考面试题&#xff0c;也是实际开发中&…

非交换几何与黎曼ζ函数:数学中的一场革命性对话

非交换几何与黎曼ζ函数&#xff1a;数学中的一场革命性对话 非交换几何&#xff08;Noncommutative Geometry, NCG&#xff09;是数学的一个分支领域&#xff0c;它将经典的几何概念扩展到非交换代数的框架中。非交换代数是一种结合代数&#xff0c;其中乘积不是交换性的&…