异步编程

95 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情

大家好!我是前端爬楼工程师🚹,一个野生程序员。好奇新技术,仰慕牛大佬。如果喜欢我的文章,可以关注➕点赞,为我注入能量,与我一同成长吧~

异步编程指的是程序中的一部分现在运行,另一部分在将来运行,现在和将来之间有段间隙,在这段间隙中,程序没用活跃。

异步控制台

console.*方法族不是Javascript的一部分,而是由宿主环境添加到Javascript中的。console.log有时候并不会将传输内容立即输出。因为console.log属于I/O,有时候浏览器为了提高性能,后台会异步处理它。

var a = {index:1}
console.log(a)  // 不一定是{index:1}
a.index++ 

事件循环

JavaScript引擎得依靠宿主环境运行,环境提供了一种机制来执行每块代码,这种机制叫事件循环。

JavaScript没有时间概念,settimeout并没有把你的回调函数挂在事件循环队列中,它所做的就是一个定时器,当到设定的事件后,才把回调函数放到事件循环中,在未来某个时刻tick执行这个回调。所以当事件循环队列排的比较满时候,你的回调就会等待,他得排到其他项的后面,这是settimeout精度不高的原因。

循环队列里通常还会有和你程序不相关的其他事件。

并行线程

异步是现在和将来的时间间隙,并行则是能够同时发生的事情。

并行计算最常见的工具是进程和线程。

完整运行

var a = 1
var b = 2
function foo(){
    a++
    b = b*a
    a = b+3
}
function bar(){
    b--
    a = 8 +b
    b = a* 2
}
ajax("", foo)
ajax("", bar)

JavaScript是单线程的,foo()bar()中的代码具有原子性。一旦foo()开始执行,它的所有代码都会在bar()中的任意代码运行之前完成,反之亦然。这称为完整运行特性。

foobar是将来运行的,有可能执行顺序不一样,导致ab的最终结果也会不一样,这种函数不确定性就是竟态条件