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中的“异步”操作,都是耗时操作加入事件循环,并在特定时机执行一个函数的模式。
原文链接

你可能感兴趣的:(JS中的同步与异步)