1.简单的理解

  JavaScript是单线程的!总所周知,正常代码是从上而下,一条一条顺序执行的。就好比下楼梯,第一条代码先获得内存或者先执行操作。当遇到漫长的处理操作时(比如读取庞大的文件时,执行大量的计算时),就会发生阻塞。如下图:

    

  

    var fs = require("fs");
    var data = fs.readFileSync('input.txt');//读取文件
    console.log(data.toString());      //读完了文件才能执行=====>data.tostring()
    console.log("程序执行结束!");

    这就导致你后面要走的路( console.log("程序执行结束!");)是受你这阶长路相关联的代码(console.log(data.toString());)影响的。

    就问你难不难受?

    好在javascript有个回调这个功能,说白了就是收到事件完成的通知后要执行的内容。如下图:

  紫色代表执行过的代码,红色表示data.toString()代码,小人则表示老哥们在哪。

  var fs = require("fs");

  fs.readFile('input.txt', function (err, data) {
      if (err) return console.error(err);
console.log(data.toString());     //但是!data.toString()在文件读取后并不会立即执行
  });
  console.log("程序执行结束!");

  输出:

  >程序执行结束!
  >菜鸟教程官网地址:www.runoob.com

  这里我们可以看到,是先打印“程序执行结束!”,再执行data.String()的。这说明,我们下完楼梯才会去走上移了的路。(即,执行完js主程序所有的代码,才会去执行回调)

  我就问你刺不刺激?

2.比较

   一目了然的发现,我盗用了代码。第一段代码是阻塞代码,第二段代码是非阻塞代码。有了回调后,咱就不用担心效率问题喽!

  假如上面阻塞代码要执行完需要:10s(做个比方,别当真)=======>读文件用时7s======>打印文件内容2s======>打印结束1s(ok  7+2+1=10)

        则非阻塞代码需要:=======>读文件用时7s=======>打印结束1s=======>打印文件内容1s(What the  fuck!  7+1+2=10)

  执行顺序发生改变却没有提高运行速度!

  

  这其实是一个哲♂学问题!

  如果代码的侧重点不是看向-打印文件内容,而是看向-打印结束。这样原来要第10秒这个时间才能执行打印结束,而老子现在第8秒就能打印结束,足足快了2秒啊!!!想想如果把打印结束这段代码变成请求回复,我的天呐。。。。

  说了一堆废话,收。

3.0异步

  单线程是什么,我可不管单线程是什么,在我的想象中,单线程就好像一根吸管,吸就完事了。不对,单线程是老哥一人对着吸管一个劲的吸,独享一个管的快乐。那多线程就像是老哥的快乐基友们看见老哥在偷吃,抢走了快乐!一群人你一口,我一口的用吸管吸!你吸的时间长,你占用的cpu的时间就长,其它快乐基友就只能看着你喝。为了合理,咱就排队轮流来。。。扯远了

  同步,我的理解就是在一个时间间隔内,第一步执行完执行第二步,顺序执行。那异步就是在这一个时间间隔里,我不光执行第一个动作,同时我还在做着另一个动作。

  那有人要问了,你胡说,你这两段代码都是顺序执行的呀,呵呵。

  哼,事实上异步处理对于cpu来说也是顺序执行,只是每段代码处理速度快到你以为是同时发生的。想想老哥和基友们,每个人使用吸管的时间足够断,在肉眼上就能够看到一个会变化的人在吸一个吸管的假像。

  具体来说,异步运行机制如下:
  (1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
  (2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
  (3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
  (4)主线程不断重复上面的第三步。
   --------------------- 
   原文:https://blog.csdn.net/qq_22855325/article/details/72958345  

  说的真好!

   

  

关于javascript异步的更多相关文章

  1. JavaScript异步编程的主要解决方案—对不起,我和你不在同一个频率上

    众所周知(这也忒夸张了吧?),Javascript通过事件驱动机制,在单线程模型下,以异步的形式来实现非阻塞的IO操作.这种模式使得JavaScript在处理事务时非常高效,但这带来了很多问题,比如异 ...

  2. JavaScript异步编程原理

    众所周知,JavaScript 的执行环境是单线程的,所谓的单线程就是一次只能完成一个任务,其任务的调度方式就是排队,这就和火车站洗手间门口的等待一样,前面的那个人没有搞定,你就只能站在后面排队等着. ...

  3. javascript异步编程的前世今生,从onclick到await/async

    javascript与异步编程 为了避免资源管理等复杂性的问题, javascript被设计为单线程的语言,即使有了html5 worker,也不能直接访问dom. javascript 设计之初是为 ...

  4. JavaScript异步编程(2)- 先驱者:jsDeferred

    JavaScript当前有众多实现异步编程的方式,最为耀眼的就是ECMAScript 6规范中的Promise对象,它来自于CommonJS小组的努力:Promise/A+规范. 研究javascri ...

  5. 【转】JavaScript 异步进化史

    前言 JS 中最基础的异步调用方式是 callback,它将回调函数 callback 传给异步 API,由浏览器或 Node 在异步完成后,通知 JS 引擎调用 callback.对于简单的异步操作 ...

  6. 对Javascript异步执行的理解

    简单的查看了下Javascript异步编程的代码.按照网上的说法,Javascript异步编程的核心就在于setTimeout.这个系统函数让我们将函数的执行放在了一个指定的新“线程”中.于是本来的顺 ...

  7. Promises与Javascript异步编程

    Promises与Javascript异步编程 转载:http://www.zawaliang.com/2013/08/399.html 在如今都追求用户体验的时代,Ajax应用真的是无所不在.加上这 ...

  8. Javascript 异步加载详解

    Javascript 异步加载详解 本文总结一下浏览器在 javascript 的加载方式. 关键词:异步加载(async loading),延迟加载(lazy loading),延迟执行(lazy ...

  9. javascript异步延时载入及推断是否已载入js/css文件

    <html> <head> <script type="text/javascript"> /**======================= ...

  10. Javascript异步请求你能捕获到异常吗?

    Javascript异步请求你能捕获到异常吗? 异常处理是程序发布之前必须要解决的问题,不经过异常处理的应用会让用户对产品失去信心.在异常处理中,我们一贯的做法是按照函数调用的次序,将异常从数据访问层 ...

随机推荐

  1. Android根据word模板文档将表单数据生成word文档的方案整理

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 尝试的方案包括以下几种: freemarker 只能在java项目上运行,无法在Android项目上运行: 参考资料:<Fre ...

  2. HashMap?面试?我是谁?我在哪

    现在是晚上11点了,学校屠猪馆的自习室因为太晚要关闭了,勤奋且疲惫的小鲁班也从屠猪馆出来了,正准备回宿舍洗洗睡,由于自习室位置比较偏僻所以是接收不到手机网络信号的,因此小鲁班从兜里掏出手机的时候,信息 ...

  3. swagger Failed to load Api definition 的问题

    这个问题是由于Tomcat乱码问题导致的,修改server.xml文件的编码格式修改成UTF-8

  4. DataPipeline丨新型企业数据融合平台的探索与实践

    文 |刘瀚林 DataPipeline后端研发负责人 交流微信 | datapipeline2018 一.关于数据融合和企业数据融合平台 数据融合是把不同来源.格式.特点性质的数据在逻辑上或物理上有机 ...

  5. IconFont的iOS使用

    IconFont的使用 Iconfont-国内功能很强大且图标内容很丰富的矢量图标库,提供矢量图标下载.在线存储.格式转换等功能.阿里巴巴体验团队倾力打造,设计和前端开发的便捷工具. https:// ...

  6. Windows上搭建远程访问服务

    Windows上搭建远程访问服务 转自:https://blog.51cto.com/13871378/2153308?source=dra 概述:允许客户机通过拨号连接或虚拟专用网连接到公司局域网, ...

  7. Docker 容器与宿主机网段冲突导致网络无法 ping 通的解决方案

    docker 容器网络默认使用 bridge 桥接模式,正常情况下,容器会使用 daemon.json 中定义的虚拟网桥来与宿主机进行通讯. 最近更新 Docker for mac 之后,发现以前容器 ...

  8. Linux 桌面玩家指南:16. 使用 CUDA 发挥显卡的计算性能

    特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...

  9. 微信公众平台网页登录授权多次重定向跳转,导致code使用多次问题

    背景:微信网站开发 昨天我负责的一个项目忽然出现了一个十分诡异的bug,进行微信授权登录的时候请求code的时候安卓手机会多次重定向调转我的接口接收code的接口(redirect_uri 微信请求调 ...

  10. 安装Adobe时出现Adobe Application Manager丢失或损坏解决方法

    很多朋友在安装Adobe系列产品时出现Adobe Application Manager丢失或损坏,这是由于上次安装的Adobe产品没有正确卸载,导致这次安装失败.那么如何解决这一问题呢? 1.下载安 ...