异步与同步

从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。

看的懂更好,通过下面的实例也同样可以理解。

var fs = require("fs");
var data = fs.readFileSync("new.txt");
console.log(data.toString());

fuckreadFileSync是同步方法,会阻塞直到得到结果后,才继续执行之后的语句。god

var fs = require("fs");
fs.readFile("new.txt",function callback(err,data){
   console.log(data.toString());
});
console.log(“first me run”);

会发现 console.log(“first me run”)先执行。 因为readFile是异步函数,不会阻塞之后的语句。callback是回调函数,等到底层读取完数据后,会调用该函数。god

bookNode.js中回调函数的规范是:

function callback(err,args0,args1 … ){}

下面我们模拟一个异步函数,和回调函数,加深理解。

function sumAsync(a,b,callback){
   setTimeout(function(){
       if(typeof a === "number" && typeof a === "number"){
           callback(null,a+b);
       }else{
           callback(new Error("must number"));
       }
   },200)
}

sumAsync(2,3,function callback(err,rs){
   console.log(rs);
})

console.log("first run !");

我们定义一个sumAsync异步函数,运行后,会先执行 console.log("first run !"); ,根据这个实例,应对异步函数、回调概念已理解。在Node.js 的实际开发中,I/O操作都应该调用异步函数,这样才能发挥更好的性能,但回调函数的嵌套很丑,为了解决这个问题,之后的几节中,会介绍 Promises 的Q库 和 ES6 generator 及 co 库,通过这几个工具即能发挥Node.js高性能,又可让代码更好维护、更可控和更好的可读性。