由于函数中存在现在无法完成的任务将会在未来的事件完成,这么做到目的就是不希望阻塞行为的出现,所以我们提出异步行为
那些你不知道的事
1、事件循环
所有的事件都是以队列的形式排列好,处理机每次会从队列中取出一个事件进行处理,当异步函数触发之时,也就是事件加入到循环队列之日,所以并不是异步函数触发,就会发生真正的触发,而是要等处理机真正的处理到它
2、单线程的必要性
由于在处理多线程问题时,会出现跨线程共享数据的情况,为了减少这种跨线程的不确定性,我们要使javascript具有单线程的特性,具有原子性
3、javascript中的并发
这里的并发我们可以理解为任务,我们知道有些事件看似使同时发生的,其实这只是两个或者多个进程(任务)在同一时间段发生,并不需要是同一时刻。由以上的单线程特性,我们知道处理事件的原子性,同时根据事件循环,我们知道,那些看似同时发生的事件,不过也是在微小的事件片上按顺序的放入和取出。
由顺序这个概念我们继续探究并发进程的交互 ####4、并发进程的交互 由于在事件放入事件循环队列这个过程中,会出现进程之间顺序依赖的问题,所以我们需要加以限制条件,保证进程的顺序,这个限制条件叫竞态条件
4、任务队列
类似于玩完一轮游戏后,可以插队继续玩
console.log("A")
setTimeout(function(){
console.log("B")
},0)
schedule(function(){
console.log("C");
Schedule(function(){
console.log("D")
})
}) //输出顺序 A,C,D,B
之所以这么输出,是因为在事件循环的结尾处,开始任务处理
5、回调的探究
回调函数实际上是调用函数接下来的动作,但是在编程过程中,这种异步的编程执行顺序和我们顺序阻塞式思维不符,操作起来并不方便