博客
关于我
java同步异步的异同_JS基础——同步异步的区别
阅读量:795 次
发布时间:2023-01-28

本文共 1258 字,大约阅读时间需要 4 分钟。

JavaScript是一种单线程语言,`ereignah起250px; background:#f5f5f5; border:1px solid #ddd; padding:10px; border-radius:4px;">

`` `
` `
` `
` `
`

JavaScript语言是一门“单线程”的语言,

`
`

不像Java语言,类继承Thread再来个thread.start就可以开辟一个线程。

`
`

所以,JavaScript就像一条流水线,仅仅是一条流水线而已,要么加工,要么包装,不能同时进行多个任务和流程。

`
`

“同步”——一下就让人想到“一起”这个词;

`
`

“异步”呢,从字面来看,好像是在不同的(异)的方式上进行操作,

`
`

那让我想想,最常见的“一边...一边...”是否是异步的正确描述?比如‘小明一边吃雪糕一边写作业’,看起来没问题,但实际上这不是正确的异步概念!

`
`

事实上,同步和异步的区别在于在单线程环境下,两个任务的执行顺序不同。

`
`

最基础的异步操作体现在`setTimeout`和`setInterval`函数中。很少有人真正理解它们的异步性,尽管它们能够控制JavaScript的执行顺序,实现任务调度。

`
`

比如说以下代码:

console.log("1");

setTimeout(function() { …… }, 0);

同样是设置延迟时间为0的`setTimeout`函数,其作用是在指定的时间点执行函数的逻辑,但实际上,这些函数会被排队到任务队列中,等待当前执行栈空闲时再被处理。

从运行结果来看,尽管设置了延迟时间为0,依然遵循任务队列的执行顺序,输出结果可能是1, 2, 3, 4, 5,而不是在定时的时间点执行函数的预期顺序。这就解释了为什么尽管延迟时间很短,函数依然会被排队执行。

任务队列的背后是浏览器的事件循环机制。所有同步任务都会在执行栈(Execution Context Stack)中执行,当执行栈空闲时,系统会去读取任务队列(Task Queue),逐个取出事件并从中获取相应的回调函数,执行这些异步任务。

要理解事件循环,我们需要认识到浏览器的主线程无法同时处理多个任务,它会将所有耗时操作排队。当处理完同步任务后,主线程会去处理任务队列中的事件。这就形成了JavaScript的单线程异步调度机制,确保程序不会因为某个操作长时间卡住,而忘记处理其他重要的任务。

从任务队列来看,除了网络操作的回调函数之外,还有其他类型的事件回调函数会被存储在其中。例如,用户点击页面的按钮或滚动屏幕,这些事件也会对应相应的回调函数,从而被加入任务队列,等待执行。

最重要的是,理解回调函数的作用。每当发生某些特定事件时,定义的回调函数会被附加到任务队列中。当事件循环机制检测到任务队列有事件需要处理时,它就会将相应的回调函数从队列中取出并执行。这样,主线程就能在适当的时候处理这些耗时的操作,而不阻塞整个程序运行。

``

转载地址:http://nsryk.baihongyu.com/

你可能感兴趣的文章
$route 和 $router详解、区别、示例代码
查看>>
$scope angular在controller之外调用
查看>>
&和&&的区别
查看>>
(215:断言失败)函数‘;DFT‘中的type==CV_32FC1||type==CV_32FC2||type==CV_64FC1||type==CV_64FC2;
查看>>
(AS3)BitmapData.draw比BitmapData.copyPixel能做得更多
查看>>
(discord.py) 有没有办法让 on_message 事件查看嵌入式消息而不是普通消息?
查看>>
064:vue+openlayers根据坐标来显示点、线段、圆形、多边形
查看>>
(ios实战)单个ViewControl适配不同ios版本xib文件实现
查看>>
(Leetcode-字符串-2) 字符串运算
查看>>
(type interface {}) to type string
查看>>
(zhuan) Evolution Strategies as a Scalable Alternative to Reinforcement Learning
查看>>
(五)java多线程之Lock类
查看>>
(十一) 构建dubbo分布式平台-dubbo简介
查看>>
(十一)JAVA springboot ssm b2b2c多用户商城系统 - SSO单点登录之OAuth2.0登录流程(2)
查看>>
asp.net MVC 强类型视图表单Ajax提交的注意事项
查看>>
Asp.Net MVC 必备插件MVC Route Visualizer(Visual Studio 2012 版)
查看>>
canvas设置文字阴影
查看>>
Centos 5.2+mysql-5.0.51a+httpd-2.2.8+PHP5.2.5(运行脚本)
查看>>
Centos 5.3 ADSL拨号组建中小型企业网络
查看>>
Centos 5.8 安装后不能使用ifconfig
查看>>