JS中的同步与异步

本文深入探讨了JavaScript中的同步与异步编程概念,解释了浏览器的多线程与JS单线程特性,以及同步、异步任务如何在主栈与等待队列中调度执行。文章还介绍了宏任务与微任务的区别,包括定时器、AJAX请求、Promise及async/await语法的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JS中的同步与异步

一、JS中同步异步编程
浏览器是多线程,JS是单线程的(浏览器只分配一个线程来执行JS)
进程大线程小:一个进程中包含多个线程,例如在浏览器中打开一个HTML页面就占用了一个进程,加载页面的时候,浏览器分配一个线程去计算DOM树,分配其他的线程去加载 对应的资源文件。。。在分配一个线程去自上而下执行JS

  • 同步:在一个线程上(主栈/主任务队列)同一个时间只能做一件事情,当前事情完成才能进行下一个事情(先把一个任务进栈执行,执行完成,再把下一个任务出栈,上一个任务出栈)

  • 异步:在主栈中执行一个任务,但是发现这个任务是一个异步的操作,我们会把它移除主栈,放到等待任务队列中(此时浏览器会分配其他线程监听异步任务是否到达指定的执行时间),如果主栈执行完成,监听者会把到达时间的异步任务重新放到主栈中执行。。。

  • ​ [宏任务:macro task]

  • 定时器 【宏任务】
    绑定

    • ajax
let xhr = new XMLHttpRequest();
xhr.open('post', 'www.baidu.com',);
xhr.send();
/*放到等待区之前状态为1*/
xhr.onreadystatechange = () => {//=>状态改变才会触发,
    console.log(xhr.readyState);
};
//输出为 2  3  4 
函数
- Node中fs可以进行异步的I/O操作

[微任务:micro task]
- Promise(async/await) => Promise并不是完全的同步,当在Excutor中执行resolve或者reject的时候,此时是异步操作,会先执行then/catch等,当主栈完成后,才会再去调用resolve/reject把存放的方法执行

  • =>ES7中新增加对Promise操作的新语法:async/await(使用await必须保证当前方法是基于async修饰的)
1.先把AA执行,返回一个PROMISE实例
 2.它会暂时跳出当前正在执行的函数(FN):也就是AWAIT后面的代码暂时先不执行(把后面的代码从主栈中移除,放到等待区域中)
3.主栈暂时空闲     
4.当主栈中的其它任务完成(主栈空闲),并且AA中的PROMISE也已经计算完成最后的结果,在把之前第二步移到等待区域的内容,重新拿回到主栈中执行
  • process.nextTick

执行顺序优先级:SYNC【同步】 => MICRO 【微任务】=> MACRO【宏任务】

所有JS中的异步编程仅仅是根据某些机制来管控任务的执行顺序,不存在同时执行两个任务这一说法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值