1、理解I/O
I/O(input / output),即输入输出,在电脑上的输入输出如音频录音是生意的输入,听音乐是声音的输出,在服务器上可以理解为读写操作。
2、并发
指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。nodejs是单线的执行代码的,使用异步替代多线程。
3、同步与异步
同步,如下图第一个点餐人员没有点餐结束,后续的点餐人员就只能排队,在程序中表现就是当前代码没有运行结束,下一条代码就不能运行。
异步,如下图一个人去点餐,把自己要的东西点好后,就到休息区等待,餐配好后,配送完来配送或者到呼叫到取餐台去领取实物。这样点餐就不会阻塞,但是可能不会是先来的先配送。
同步与异步的区别:异步不会阻塞后面的代码,同步会阻塞后面的代码。
同一段代码中同步代码和异步代码谁先执行呢?
setTimeout(function(){
console.log(4);
},1000);
console.log(1);
console.log(2);
console.log(3);
结果:1 2 3 4
答案可知道,先执行同步代码,在执行异步代码。
执行原理图
回调函数callback模拟
var fn = function(callback){ setTimeout(function(){ var food = "炸鸡腿"; callback(food); },1000); console.log("配餐"); } fn(function(data){ console.log(data); });
常见异步操作
异步非I/O | setTimeout、setInterval |
异步I/o | 网络操作http 文件操作fs |
4、__dirname 与 path 变量的使用
module目录下的文件
1.js
var fr = require('./module/2.js'); fr('test.txt',function(data){ console.log(data); });
当2.js中的代码为
var fs = require('fs'); var fr = function(file,callback){ fs.readFile(file,'utf8',(err,data)=>{ callback(data); }); } module.exports = fr;
输出结果是module同级目录test.txt文件中的内容。
但是,我想要输出的是module目录下的test.txt文件内容,2.js中的代码需要引入__dirname
var fs = require('fs'); var fr = function(file,callback){ fs.readFile(__dirname + file,'utf8',(err,data)=>{ callback(data); }); } module.exports = fr;
file是一个参数,这里对参数的写法并没有限制,但是如果 file 的值 携程 “./test.txt”就不会访问到test.txt文件,这里可以使用path变量,多用户输入进行过滤。
path变量核心的方法 path.join(),在上述代码中,将上诉代码修改为
var fs = require('fs'); var fr = function(file,callback){ fs.readFile(path.join(__dirname,file),'utf8',(err,data)=>{ callback(data); }); } module.exports = fr;
就可以起到更好的兼容效果,传入“./test.txt”也可以访问到。
5、异常处理
异常:计算机不能处理的情况
以下代码中abc.js是一个不存在的文件,执行该代码
var fs = require('fs'); fs.readFile('abc.js','utf8',function(err,data){ console.log(err); console.log(123); });可以看到console.log(123);可以打印。node的异步方法时不处理异常的。
var fs = require('fs'); fs.readFile('abc.js','utf8'); console.log(123);
执行结果
nodejs对同步代码的异常是处理的。
同步与异步异常处理的差别。 使用 try{} catche(e){}以下异常处理。
这是一段异步代码异常处理。
var fs = require('fs'); try{ fs.readFile('abc.js','utf8',function(err,data){ if(err) throw err; }); }catch(e){ console.log(e); }
这样的写法是处理不了异常的,因为try catch 代码已经处理执行完成,异步代码操作才执行。
无论是异步还是同步代码,都只能进行同步处理,处理如下
fs.readFile('abc.js','utf8',function(err,data){ try{ if(err) throw err; }catch(e){ console.log(e); } });
结果