js同步和异步难点重点详解

1. 解决什么问题?

决定:浏览器发网络请求的时候,代码是停下来等结果,还是继续往下跑别的代码 。 xhr.open(请求方式, 接口地址, 是否异步) 第三个参数:

  • true = 异步(默认值,推荐,日常全部用这个)
  • false = 同步,禁止随便用

✅异步(async=true,默认)

浏览器发起请求 → 不会卡住页面,代码继续往下执行 ; 等后端返回数据了,自动触发onreadystatechange回调函数处理结果。

类比: 你给外卖打电话下单(发请求),你不用站在原地一动不动干等;你可以刷手机、写代码。外卖送到了(请求返回),电话通知你(回调函数执行)。

复制代码
// 异步(默认true,可以省略不写)
xhr.open("GET", apiUrl, true)

特点:页面不会卡死,推荐项目全部使用异步。

❌同步(async=false)

浏览器发起请求之后,原地阻塞,所有代码暂停,页面卡死,必须等到服务器返回结果,代码才能继续往下执行。 如果网络慢,页面直接卡住,按钮点不动,浏览器甚至提示页面崩溃。

类比:打电话点外卖,你拿着手机一动不动,啥也不干,必须等到外卖送到才能做别的事。

复制代码
// 同步写法,不推荐!仅学习了解,项目不要写
xhr.open("GET", apiUrl, false)
xhr.send()
// send执行完,请求结束之后,才会执行后面代码
if(xhr.readyState === 4 && xhr.status === 200){
  console.log(JSON.parse(xhr.responseText))
}

同步异步核心对比表(博客放表格,清晰)

表格

类型 open 第三个参数 特点 优缺点 使用场景
异步 true(默认) 请求发出,代码继续跑,回调拿到结果 页面不卡死,体验好 绝大多数接口请求,日常开发
同步 false 代码暂停,等待请求完成,阻塞主线程 页面卡死,体验极差 几乎不用,特殊底层场景

新手高频坑: 异步请求,不能在 send 后面直接拿返回结果!

复制代码
// ❌错误写法!
xhr.open("GET",url)
xhr.send()
let result = JSON.parse(xhr.responseText) 
// send刚发出去,数据还没回来,responseText是空!
// 拿结果只能写在onreadystatechange回调里面!

一句话记忆:异步,结果在回调里面拿;同步,send 之后直接拿,但是页面会卡,尽量别用。

相关推荐
catchadmin37 分钟前
PHP 8.7 协程新提案 让跨协程代码共享请求身份
开发语言·php
念何架构之路1 小时前
go-grpc设计思想
开发语言·后端·golang
酷炫码神2 小时前
Day 10|Pinia 状态管理:把散落在各组件的数据,收进一个全局仓库
android·开发语言·javascript
Elastic 中国社区官方博客3 小时前
我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic
java·大数据·开发语言·elasticsearch·搜索引擎·全文检索·es
tyn1883 小时前
记录本地安装nacos服务的方法及异常
java·开发语言
步行cgn3 小时前
Spring MVC 视图机制的核心接口与类
java·开发语言·后端·spring·mvc
传奇开心果编程4 小时前
【Rust入门练中学】第5课:引用与借用
开发语言·rust·引用·编程语言理论·通用编程语言·借用
qetfw4 小时前
Bash 变量:export、位置参数与默认值展开验证
linux·开发语言·chrome·bash
酷炫码神4 小时前
Day 8|Vue3 响应式:告别手动操作 DOM,让数据驱动界面
javascript·vue.js·ecmascript
电子云与长程纠缠4 小时前
UE5魂系游戏开发教程05
开发语言·学习·游戏·ui·ue5