JS的异步和同步函数

好久没有写博客了,从7月1日我正式从电子工程师(其实就是写单片机程序的)转为了前端开发(萌新),新工作加班较多,一些知识也没有放在博客上,今天遇到了同步和异步的问题,作为一个新的开始,重新记录。

起源

要弄清楚同步和异步的问题,必须搞清楚js的单线程,以前看书和博客常常看到说“JavaScript是一种异步单线程的变成语言”这句话,以前理解的不太深入,今天通过查询资料,重新学习了一遍,

1. js的单线程含义

js是异步单线程执行的程序,所谓的单线程,只是指js引擎解释和执行的线程只有一个,除了这个线程还有ajax线程、图片加载线程等等,统称为工作线程。所谓的异步是指js的解释和执行线程发起对工作线程执行任务的通知,然后立即返回执行下一步程序,等待工作线程完成要执行的任务,然后通知主线程执行对应的回调函数,成为异步。比如定时函数

settimeout(() => { console.log("哈哈哈")},1000)

其中settimeout是通知定时线程的函数,而箭头函数是定时线程完成定时线程后通知主线程开始执行的回调函数。

2.异步和同步函数

同步:同步是指函数执行完毕后,能够理解得到想要的结果,或者说是能得到一个确定的返回。例如

console.log("abc")

这个同步函数能够立即得到执行的结果,立马输出abc,这就是同步函数。
异步:异步是函数执行完毕后,结果必须在未来经过某种手段才能获得(如 回调函数 等等)。 例如

settimeout(() => { console.log("哈哈哈")},5000)。
console.log("now")

其中,settimeout是主线程对工作线程的一个应用调用通知,执行次应用调用函数后会立即返回执行下面的js程序,但是箭头内部的console。log输出是在未来等待定时工作线程完成5秒的计时后通知主线程,然后执行输出。考虑的在底层一些,也就是eventloop函数轮转调用,console.log(“now”)会立即执行,而console.log(“哈哈哈”)是会在下一轮主线程循环时开始调用(5秒定时到后)

3、js作为服务端的好处

从Node.js考虑,作为web服务器,当java、php、node.js遇到并发时各自的处理情形是:

  1. php:多进程处理,来一个请求,开一个进程
  2. java:多线程,来一个请求,开一个线程,或者默认拥有一个线程池,遇到新连接,从线程池里分配一个。
    
  3. node,js: 异步处理,主线程接受请求,工作线程处理请求。

一般来说第三种处理方式效率最高,但是对于不适用与一些CPU密集型的业务。写到这里,不禁想到后续是否是可以考虑用nodejs的框架egg.js等搭个物联网的broker呢???
嗯,可以尝试一下。。。

你可能感兴趣的:(WEB基础)