手机版

对JavaScript异步的简单理解

时间:2021-08-23 来源:互联网 编辑:宝哥软件园 浏览:

众所周知,JavaScript是一种单线程语言。在笔试过程中,我们不断遇到一些输出问题,考虑到异步编程的掌握。通常,当被问及异步时,我脑海中的第一反应是Ajax、setTimseout等等。平时做项目的过程中,大部分操作都是异步的。JavaScript异步是通过回调来完成的,回调在开发过程中已经被处理过了,可能在不知不觉中就进入了回调地狱。

浏览器线程

在开始之前,我们先简单讲一下浏览器线程,对浏览器操作有一个基本的了解。都说JavaScript是单线程的工作,但并不意味着浏览器就是单线程的。

JavaScript引擎中只有一个线程负责解析和执行JavaScript代码。但是除了这个主进程,还有许多其他工作线程。那么onclick回调、setTimeout和Ajax这些东西是如何实现的呢?也就是说,浏览器使用其他几个线程来辅助JavaScript线程。

浏览器有许多线程,例如:

1.图形用户界面渲染线程-图形用户界面渲染线程暂停,即冻结。2.JavaScript引擎线程——用于解析JavaScript代码。3.计时器触发的线程浏览器计时器计数器不是js引擎计数。4.浏览器事件线程——用于解析BOM渲染等。5.http线程——主要负责数据请求。6.EventLoop轮询处理线程——当事件被触发时,这个线程会将事件添加到要处理的队列尾部。7.等等。

从上面可以得出结论,浏览器其实做了很多事情,远没有想象的那么简单。在这些线程中,GUI渲染线程、JavaScript引擎线程和浏览器事件线程是浏览器的常驻线程。

当浏览器开始解析代码时,它将根据代码被分配给不同的工作线程。

过程

进程是运行在操作系统中的应用程序

线

线程是独立执行任务的进程中的一个单元。线程本身基本上没有系统资源,只有一些必不可少的资源(比如程序计数器、一组寄存器和栈)。

一个进程中有线程,一个进程中可以有n个进程。我们可以在电脑的任务管理器中看到正在运行的进程,我们可以认为一个进程正在运行一个程序,比如用浏览器打开一个网页,就是启动一个进程。但是如果你打开三个浏览器,你就打开了三个进程。

同步异步

既然我们想了解同步和异步,当然,我们应该简单地谈谈同步和异步。说到同步和异步,它真的属于Ajax。为了使示例更加明显,不使用Ajax示例。(ˇˇ)

同步

同步将逐行执行代码,这将阻塞后续代码,并且在代码收到预期结果之前不会继续向下执行。

console . log(1);警报(“同步”);console . log(2);//结果://1//同步//2异步

如果调用者在函数返回时得不到预期的结果,但将来会通过一定的手段(比如回调函数)得到结果,这就是异步的。

console . log(1);SetTimeout(()={alert('异步');},0);console . log(2);//结果://1//2//异步为什么JavaScript要采用异步编程

正如我在开头所说的,JavaScript是一种由单线程执行的脚本语言(这可能是由于历史原因或为了简单起见而设计的)。它的单线程表明,任何函数只有从头到尾执行完才会被执行。界面的更新、鼠标事件的处理和定时器(setTimeout、setInterval等)的执行。)需要先排队,然后串行执行。如果一个JavaScript从头到尾需要很长时间执行,那么任何UI更新都会被阻止,界面事件处理也会停止响应。在这种情况下,需要异步编程模式。目的是中断代码的运行或者让IO调用(比如AJAX)在后台运行,这样接口更新和事件处理就能及时运行。

JavaScript的设计者意识到主线程可以挂起等待的任务,不管IO设备如何,先运行后面的任务。当IO设备返回结果时,返回并继续执行挂起的任务。

异步操作机制:

1.所有同步任务都在主线程上执行,形成一个执行堆栈。

2.除了主要路线,还有一个任务队列。只要异步任务有运行结果,事件就会被放入任务队列。

3.一旦执行堆栈中的所有同步任务都被执行,系统将读取任务队列以查看其中有哪些事件。那些对应的异步任务结束等待状态,进入执行栈,开始执行。

4.主线程重复上面的第三步。

例如:

Button onclick='updateSync()'同步button onclick=' updateasync()'异步/button div id=' output '/script function updateSync(){ f

版权声明:对JavaScript异步的简单理解是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。

相关文章推荐