JS中的同步与异步

首先,js是单线程的,这一点毋庸置疑。

同步异步的概念:
同步:大家按照顺序,你运行完我运行,不存在你我同时运行的情况;优点是实现起来比较简单,执行环境相对单纯;坏处是一旦出现耗时操作就会导致整个程序瘫痪,停止运行;
异步:大家齐头并进,一起运行,也就是明面上的“多线程”;

既然异步就约等于多线程,那js这样一个单线程语言中,怎么会存在异步呢?其实实际上js确实不存在真正意义上的“异步”,而是使用 events loop 来实现类似异步的效果。events loop 实际上就是在js在主要代码(也就是在html中所有定义的script标签)运行完后,会开启的一个循环,主要用于监听 HTML 事件和执行异步操作。所以实际上js就是单线程的,包括setTimeoutsetIntervalXMLHttpRequest都是如此的操作:将需要执行的耗时操作放入循环中,并在恰当实际执行回调函数

我们可以用以下代码来测试js一定是单线程:

setTImeout(function(){
    alert("我是一个弹窗");
},1000);
while(true){
    //不会结束的死循环
}

js有多种方法来实现伪异步,比如:回调函数,事件监听,发布订阅,Promises对象。
回调函数就是上述的setTimeoutsetIntervalXMLHttpRequest所使用的方法,传入一个函数,并在耗时操作完成时执行。
事件监听就是设定几个事件,为其设置监听事件,当某个事件发生时,执行对应的函数。
发布订阅这个模式与安卓中的广播类似,可以通过一个“平台”来“发布”某些信息,之后会将这个调用所有“订阅”这个信息的函数,与事件监听很像,但是可以通过从消息中心(其实就是)查看来更好的监控程序。
Promises函数,每一个异步任务返回一个Promise对象,该对象有一个then方法,允许指定回调函数,会在上一个世界结束后调用。(详细可以查看菜鸟教程等)
其实看完你会发现,所有在js中的“异步”操作,都是耗时操作加入事件循环,并在特定时机执行一个函数的模式。
原文链接

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 在平日的编码中,你能列出你常用的异步编码?怎么理解同步与异步? 如果仅仅停留在文字上的理解,个人觉得有口无心...
    itclanCoder阅读 507评论 0 1
  • 1.个人觉得,js中,最基础的异步是setTimeout和setInterval函数,很常见,但是很少人有人知道其...
    神秘者007阅读 543评论 0 0
  • 你应该知道,javascript语言是一门“单线程”的语言,不像java语言,类继承Thread再来个thread...
    别人家的xiao孩阅读 1,333评论 2 34
  • 目录 1. 在JS中,什么是同步异步? 2. JS中常见的异步代码 1. 在JS中,什么是同步异步? 通俗解释一下...
    临安linan阅读 5,110评论 0 6
  • JS是单线程的同步:指的是等待一件事情完成之后才会去执行下一件事,JS中大部分都是同步编程。循环就是同步的,所以在...
    没了提心吊胆的稗子阅读 328评论 0 0