JavaScript既然是单线程的,那么异步要怎么理解?
黄舟
黄舟 2017-04-10 16:49:36
[JavaScript讨论组]

不能理解异步到底说的是什么

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(10)
PHP中文网

因为是单线程的,就好像店里只有一位小姐,但是不能包夜。她先问你要什么服务,然后你想的过程(等待)。她会跑去问下一个客人,然后再回来看看你回答了没有。但是由于这个小姐非常灵活,跑得非常快,所以你感觉不到等待。可是,她就是不能包夜!

PHP中文网

异步是一种代码执行方式,单线程下的异步可以这样理解,
假设有如下代码段,其中代码段B是需要异步执行的代码,
code block A;
async code block B;
code block C;
那么一个线程执行完A后,即将执行B,但发现B需要异步执行,那么线程将B放入队列中等待,然后跳过B,执行C,当C执行完后线程空闲,再去队列中把B取出来执行。

高洛峰

kfc中有一条队列,有三个人排队点餐, 第二个人没带钱,需要等人把钱送到他的手上,需要两个小时。

同步: 这个人会等两个小时排在队伍中并阻塞队列,这样第三个人也需要等待第二个拿到钱之后才能点餐。
异步: 第二个人先到新的地方等待,等到人把钱送到手中他才会重新排入队列中, 这样就不会影响第三个人点餐。

你可以参考这篇文章
JavaScript 运行机制详解:再谈Event Loop 标注版

怪我咯

你发送一个请求服务器总得响应吧,客户端等待响应需要一段时间,等服务器响应再有动作是同步,不需要等服务器响应就有动作的是异步

高洛峰

银行柜台办事,先取号,等叫号,差不多这个意思,

大家讲道理

单线程:用javascript不能创建线程。
异步:调用一个函数,函数做的事情虽然不是立即能完成,但是函数立即返回。

黄舟

银行营业厅一个窗口按次序服务,一次叫一个号,这就是同步
但是如果某个人的资料少了,那对不起你把资料整理完了再来,业务员不会一直等你去整理资料,而是会直接
叫下一个号,并且让你准备好了再来取号。这个就叫做异步。整个办理过程不会因为你少了资料而耽搁,不会阻塞,如果服务员大家都歇了吧,这个人资料不齐大家等明天他整理完了资料再来(同步阻塞)那么营业厅肯定闹翻天了。

再来说多线程,就是开多个窗口。这个和同步异步没啥关系。

大家讲道理

你可以认为有个全局的消息队列,需要异步执行的时候就把闭包push到里面去,当前的东西运行完就从里面pop出来一个执行。

有点类似gui编程里那个消息循环。比如你调用window.close,窗口不是马上关闭,而是把关闭的消息压进消息队列,当前回调执行完才会处理关闭这个消息。然后你觉得某个回调不卡是因为它很短,如果你在回调里面循环个几百万次,UI照样是卡住移动不了。

这个是不同于(其他语言的)server的,那些都是并发执行,带上下文切换的。主线程收到消息压入队列,然后子线程从队列里面取出来执行。

ringa_lee

其实异步很简单。
以一个js例子:
setTimeout(function(){
console.log('setTimeout');
},0)
console.log('1');
console.log('2');
console.log('3');
console.log('4');

//以上程序执行时,由于setTimeout异步函数的一种,所以执行时这个函数就交给另外一个线程处理,等1,2,3,4这些主线程执行完后,进行事件队列和事件循环机制判断另外一个线程执行完没,如果执行完则将其他线程的结果返回主线程!
所以看到的结果是1,2,3,4,setTimeout
类似这种异步的函数楼上已经也有说明啦!

怪我咯

可以适当理解一下CPU的时间片机制,单核处理器下,对每一个操作有一定的时间限制,以前单核CPU执行一个操作是28ms的限制,如果超过就重新入队,执行下一操作,这样就实现了单核心多线程。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号