nodejs快速入门(四)- NodeJS I/O

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);
		}
	});

结果



    


猜你喜欢

转载自blog.csdn.net/u013174239/article/details/79746768