JavaScript中的异步

        众所周知,js的执行顺序是从上至下依次执行,于是在js中就出现了两种概念:同步,异步。也是转向进阶的原因,花了很长时间去看大佬们的相关博客,为此在这里加深一下印象,也是希望能看到这篇文章的朋友给予批评和指正。

        同步,就是说js中的各个任务都是有序的去执行,相当于排队,不存在插队的情况,可能前面一个任务执行的时间比较长,但是我也得等着,等他结束才能执行我的任务。这样不太好的地方就是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行。常见的浏览器无响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环),导致整个页面卡在这个地方,其他任务无法执行。

         异步就不一样了,他的执行顺序是这样的,一群人在排队,有的人需要的时间很长,有的人只需要几秒钟就能解决,于是,就出现了这种情况,先让那些执行任务时间长的找个位置坐下,快速解决掉那些执行任务时间短的,最后再把时间长的拿过来一个一个处理,这样的好处就是相对于同步来讲,整体的效率大大提高 。 在这里只举一下回调函数异步编程的例子(时间监听 等例子理解的不够深入,不发表评论)

	
function getA(){
	console.log(1);
    // 耗时任务
	setTimeout(function(){
		console.log(2)
	},10);
     // 耗时任务
	setTimeout(function(){
		
		console.log(3)
	},20);
     // 耗时任务
	setTimeout(function(){
		
		console.log(4)
	},30);
	console.log(5)
}

getA(); //打印顺序为 1 5 2 3 4

// 跳过任务时间长的,先去执行时间短的。

实际上,异步执行任务的顺序是这样的

   1 、所有任务都是在主线程上进行,排队执行自己的任务

   2 、主线程之外,还有一个‘任务队列’,只要异步运行有了结果,就在任务队列中防止一个事件,即 将那些执行任务时间比较长的拖进来,让他们一会再执行

   3 、 直到主线程上所有的任务执行完毕后,系统再去读取‘任务队列’里的那些事件及其对应的异步任务,一一执行

举一个异步编程方法例子 

函数a()和函数b(),假设函数A 是一个执行时间比较长的任务,,函数b()可能需要一直等着。这个时候我们可以将函数A当做参数传进函数B,fb ( fa ) ;

采用这种方式,我们把同步操作变成了异步操作,fa不会堵塞程序运行,相当于先执行程序的主要逻辑,将耗时的操作推迟执行。

回调函数的优点是简单、容易理解和部署,缺点是不利于代码的阅读和维护,各个部分之间高度耦合(Coupling),流程会很混乱,而且每个任务只能指定一个回调函数。

猜你喜欢

转载自blog.csdn.net/helloHCjs/article/details/86554034