JS中异步和单线程

JS 在客户端运行的时候,只有一个线程可运行,因此想要两件事儿同时干是不可能的。如果没有异步,我们只能同步干,等待过程中卡住了,但是有了异步就没有问题了。那么单线程是如何实现异步的呢?

console.log(100)
setTimeout(function () {
    console.log(200)
})
console.log(300)

那上面的示例来说,有以下几点。重点从这个过程中体会单线程这个概念,即事情都是一步一步做的,不能两件事儿一起做。

  • 执行第一行,打印100
  • 执行setTimeout后,传入setTimeout的函数会被暂存起来,不会立即执行。
  • 执行最后一行,打印300
  • 待所有程序执行完,处于空闲状态时,会立马看有没有暂存起来的要执行。
  • 发现暂存起来的setTimeout中的函数无需等待时间,就立即来过来执行

下面再来一个setTimeout的例子。规则和上面的一样,只不过这里暂存起来的函数,需要等待 1s 之后才能被执行。

console.log(100)
setTimeout(function () {
    console.log(200)
}, 1000)
console.log(300)

下面再来一个 ajax 的例子。规则也是一样的,只不过这里暂存起来的函数,要等待网络请求返回之后才能被执行,具体时间不一定。

console.log(100)
$.get('./data.json', function (data) {
    console.log(200)
})
console.log(300)

最后再解释一下事件绑定,如下代码。其实事件绑定的实现原理和上面的是一样的,也是会把时间暂存,但是要等待用户点击只有,才能被执行。原理是一样的,因此事件绑定在原理上来说,可以算作是异步。但是从设计上来说,还是分开好理解一些。

console.log(100)
$btn.click(function () {
    console.log(200)
})
console.log(300)

原文地址:https://www.cnblogs.com/mushitianya/p/10655815.html

时间: 2024-10-03 14:38:16

JS中异步和单线程的相关文章

Web worker 与JS中异步编程的对比

0.从一道题说起 var t = true; setTimeout(function(){ t = false; }, 1000); while(t){ } alert('end'); 问,以上代码何时alert"end"呢? 测试一下:答案是:永远都不会alert. 解析:JavaScript引擎是单线程的,事件触发排队等候.所有任务按照触发时间先后排队处理. 上例中,排队的顺序状态是: | var t=true ; | while(t){}; | alert('end'); | 在

互联网我来了 -- 2. js中"异步/阻塞"等概念的简析

一.什么是"异步非阻塞式"? 这个名字听起来很恶心难懂,但如果以 买内裤 这件事情来比喻执行程序的话就很容易理解"异步非阻塞式"的涵义了. 例如你是一个CPU的线程,你需要去执行一段 买内裤的程序, 你所需执行的步骤大致如下, 到一个商店里问老板, 你们店里还有没有nb牌内裤? 买到内裤,穿上 去小卖店买点火腿回家喂狗 这时候,你作为一个线程,你可能会遇到几种状况或选择. 店里面没货了,老板一直不答应你(阻塞你),你也一直等着(同步),第三天有货了才告诉你有了,你赶

js中异步和同步

js引擎 js引擎是浏览器的重要组成部分,重要用于读取js和执行js代码. js引擎执行js时是单线程执行的. js执行为什么是单线程? 试想一下:如果js是多线程执行的,假设现在有两个线程p1,p1,那么这两个线程可以同时对同一个dom元素进行操作 比喻说,p1对dom元素进行更新操作,p2对dom元素进行删除操作,这样就会引起混乱. 既然是单线程执行,就说明js代码是从上往下一行一行解析执行的,只有上一行代码执行完毕了才会执行下一行代码.如果上一行代码解析时间很长,那么下一行代码就会被阻塞,

【译】深入理解python3.4中Asyncio库与Node.js的异步IO机制

转载自http://xidui.github.io/2015/10/29/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3python3-4-Asyncio%E5%BA%93%E4%B8%8ENode-js%E7%9A%84%E5%BC%82%E6%AD%A5IO%E6%9C%BA%E5%88%B6/ 译者:xidui原文: http://sahandsaba.com/understanding-asyncio-node-js-python-3-4.html 译者前言 如

promise 的基本概念 和如何解决js中的异步编程问题 对 promis 的 then all ctch 的分析 和 await async 的理解

* promise承诺 * 解决js中异步编程的问题 * * 异步-同步 * 阻塞-无阻塞 * * 同步和异步的区别? 异步;同步 指的是被请求者 解析:被请求者(该事情的处理者)在处理完事情的时候的通知机制. 异步:当事情处理完成后被请求者会发信息通知请求者该事情处理完成.在这期间被请求者可以选择是继续等待命令请求完成还是去做其他事等待被请求者返回. 同步:当事情处理完成后被请求者不会告知请求者,等到请求者发来询问是才会告知 阻塞:非阻塞 指的是请求者 阻塞:针对请求者来说的,委托其他人处理一

Node.js的异步I/O

Linux操作系统的I/O模型 JAVA的NIO引入了异步I/O,而Node.js宣称的就是异步编程,I/O自然是异步的.其实操作系统在很早就引入了异步I/O的概念,如下图(摘自Unix网络编程中的图片): 我对上图的理解有几点: 从IO设备读取数据到用户内存的整个过程都是由系统内核来完成: 数据总是先被拷贝到内核缓冲区,再由内核缓冲区拷贝到用户内存: 除了异步I/O,其余4种I/O模型其实都是阻塞的,至少在数据从内核拷贝到用户内存时是阻塞的: 虽然异步I/O看上去是理想解决方案,但实现上现在用

JS中的异步以及事件轮询机制

一.JS为何是单线程的? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊.(在JAVA和c#中的异步均是通过多线程实现的,没有循环队列一说,直接在子线程中完成相关的操作) JavaScript的单线程,与它的用途有关.作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM.这决定了它只能是单线程,否则会带来很复杂的同步问题.比如,假定JavaScript同时有两个线程,一个

js异步和单线程

1.同步和异步的区别 a>同步会阻塞代码执行,异步不会 b>alert()是同步  setTimeout()是异步 2.关于setTimeout(); console.log(1); setTimeout(function() { console.log(2);}, 0); console.log(3); setTimeout(function() { console.log(4);}, 0); console.log(5); // 13524 3.前端执行异步的场景: a>定时任务 b

Node.js中的异步I/O是如何进行的?

Node.js的异步I/O通过事件循环的方式实现.其中异步I/O又分磁盘I/O和网络I/O.在磁盘I/O的调用中,当发起异步调用后,会将异步操作送进libuv提供的队列中,然后返回.当磁盘I/O执行完成之后,会形成一个事件,事件循环的过程中发现该事件后,会将其消费.消费过程就是将得到的数据和传入的回调函数执行. 网络I/O与磁盘I/O的差异在于它不需要线程池来进行处理,而是在每次时间循环的过程中通过IOCP/epoll/kqueue/event ports来获取网络I/O的 事件队列. 摘自:<