node同步异步

在node中常常会遇到关于同步与异步
编译语言按各类方法能够分为各类类型,语言分为编译性语言和解释性语言
编译性语言的定义,编译性语言编写的程序被执行前,须要一个专门的编译过程,在运行前编译成机器语言文件, C++,编译后生成exe文件,无需再次编译,直接运行就能够了
可是Java、scala 则是先编译成字节码,而后解释执行字节码(能够理解为编译型语言也能够理解为解释型语言)。准确的理解,java 是编译型语言,源代码整个编译成字节码,java 字节码,是解释型语言。
解释性语言的定义,不须要编译,在运行时才编译,每一个语句在执行的时候才编译
而前端经常使用的js是解释性语言,并无将整个js文件编译后执行,js的执行分为三步
1语法解析,解析语法有没有错误,有错直接报错,整个程序不执行
2预编译,预编译发生在代码执行的前一刻,起始也没有特别的,就是变量与函数提高归window全局全部,可是只是提高变量名,在该行代码还为执行前,值为undefined
3 执行解释,顾名思意,就是从上至下,一行一行执行代码前端

同步异步

关于同步,上一行执行完,才执行下一行,依次执行,for循环未执行完,后面的代码不会运行
console.log("同步");
console.time("time");
for (let i = 0; i <1000000000; i++) {};
console.timeEnd("time");//用于测试循环时间也方便表示循环结束
console.log("同步")

关于异步,不用等上一步执行完,下一步也能直接执行,将for循环包在setTimeout()里,程序不用等到for循环执行完才执行后面的代码java

console.log("异步");
setTimeout(function(){
	console.time("time");
	for (let i = 0; i <1000000000; i++) {};
	console.timeEnd("time");//用于测试循环时间也方便表示循环结束
},1000)
console.log("异步")

异步实现原理
例子代码执行的结果是,异步1,time,异步3,异步2
第一步执行异步1没有什么奇怪的
第二步执行setTimeout()的时候,发现他是一个回调函数那么把它挂进事件轮询(Event loop),也就是任务线程中,而且执行他,可是因为计算机问题,即便时间设置为0,也会有一个默认的时间,那么就会先执行后面的代码,且他从新排是排在最后面的,也能够理解为异步函数最后执行,因此异步函数是放在最后面执行的node

console.log("异步1");
setTimeout(function(){
	console.log("异步2")
},0)
console.time("time");
	for (let i = 0; i <10000000000; i++) {};
console.timeEnd("time");
console.log("异步3")

异步的三种实现方式
1 回调函数实现异步
所谓回调函数通俗的说就是定义函数不用本身调用,系统自动调用
回调函数不必定异步,异步必定有回调函数
2 事件实现异步
在node.js中也是有事件的
3 promise
promise()是es6新增的承诺对象,用于对异步的操做进行消息传递
promise()的状态
pending等待、
resolve成功
reject失败
转换至成功或者失败
pending=>resolve
pending=>rejectes6