# day02 2020.07.21
## node简介
1. nodejs
node是基于Chrome V8引擎运行JavaScript的运行环境。
2. 安装nodejs
- 2.1
http://nodejs.org
- 2.2 卸载更新
- 删除c盘的nodejs文件
- 删除c盘/user/用户名/appData/Roaming/npm
3. 运行方式
+ 黑窗口 REPL
+ 命令运行 node js文件的名称
4. nodejs组成
- ECMAScript 核心
- 全局成员 console setTimeout...
- 系统模块 fs path http...
## fs模块
### 1. 读取文件
```js
fs.readFile(‘path‘[,option],‘callback‘)
```
+ path 读取的文件的位置
+ options 可选的参数默认为 null 其实是 buff
+ callback 回调函数
err 读取的错误信息
data 读取的数据
- 1.1 example
```js
const fs=require(‘fs‘);
fs.readFile(‘./nodejs.md‘,‘utf8‘,(err,dataBuff)=>{
if(err)return console.log(err);
console.log(dataBuff);
})
```
### 2.写入文件
- 2.1
```js
fs.writeFile(path,data[,options],callback)
```
- 2.2 example
```js
fs.writeFile(‘./2.txt‘,‘神探夏洛克什么时候更新???‘,err=>{
if(err)throw err;
console.log(‘写入成功‘);
})
```
### 3.文件拷贝
- 3.1 原始方式拷贝文件,先读取然后写入,注意循环的嵌套!
```js
const fs=require(‘fs‘);
fs.readFile(‘./nodejs.md‘,‘utf8‘,(err,dataBuff)=>{
if(err)return console.log(err);
console.log(dataBuff);
fs.writeFile(‘./2.txt‘,dataBuff,err=>{
if(err)throw err;
console.log(‘写入成功‘);
})
})
```
- 3.2
```js
fs.copyFile(src,dest[,flags],callback)
```
- src 拷贝文件源
- dest 拷贝到哪个文件
- flags 可选,是否拷贝
- callback 拷贝回到函数err
- example
```js
const fs=require(‘fs‘);
fs.copyFile(‘./nodejs.md‘,‘./2.txt‘,err=>{
if(err) throw err;
console.log(‘拷贝成功‘);
})
```
### 4.文件插入
```js
fs.appendFile(path,data[,options],callback)
```
- path 读取路径
- data 要写入的数据
- options 可选,默认utf-8
- callback 回调函数err
## path
1. path.join()
```js
// 拼接一个绝对路径
// 这个有限制拼接格式一定不能加 ./ 少了 ./
const abspath = __dirname + ‘/files/1.txt‘
// 建议使用path.join()
const abspath = path.join(__dirname,‘./files/1.txt‘)
```
## 异步和同步的区别
同一个时间内能够处理事情
同步可以处理 一个 如: 打电话
异步可以处理 多个 如: qq聊天
## 回调函数
- 所谓的回调函数就是参数的传递
```js
function getData(callback){
setTimeout(function(){
var a=1;
callback(a);
},1000)
}
getData(function(res){
console.log(res);
})
```
- Promise解决回调地狱
```js
function getData(path){
return new Promise((resolve,reject)=>{
fs.readFile(path,‘utf8‘,(err,data)=>{
if(err)return reject(err);
resolve(data);
})
})
}
// getData(‘./files/1.txt‘)
// .then(res => {
// console.log(res)
// return getData(‘./files/2.txt‘)
// })
// .then(res => {
// console.log(res)
// return getData(‘./files/3.txt‘)
// })
// .then(res => {
// console.log(res)
// })
```
## promise
### 面试7连击
#### 1. 什么是回调函数
- 回调函数就是在一个函数内把另一个函数作为参数调用!实际是参数的传递
- 所谓的回调函数就是参数的传递,在一个函数内部调用另一个函数,调用的同时可以把内部函数的数据传递出来
#### 2. 回调函数的使用场景
- 为什么使用回调函数 ? 异步请求的时候无法立刻获取到具体的值
#### 3. 回调函数多层嵌套的时候存在什么问题
- 回调地狱,不好理解也不好维护!
```js
const fs = require(‘fs‘)
function getData(path, succCallback, errCallback) {
fs.readFile(path, ‘utf8‘, (err, data) => {
if (err) return errCallback(err)
succCallback(data)
})
}
getData(‘./files/1.txt‘, function (res) {
console.log(res)
getData(‘./files/2.txt‘, function (res) {
console.log(res)
getData(‘./files/3.txt‘, function (res) {
console.log(res)
})
})
})
```
#### 4. 如何解决回调地狱
- Promise
#### 5. 使用promise 解决回调地狱
#### 6. promise 的特性
- promise 是一个构造函数,也是一个对象
- 该构造函数中需要 传递2个参数 resolve 成功的回调 reject失败的回调
- promise 的原型上有一个 then 函数
#### 7. promise 有什么缺点,如何解决
+ 代码量增多
+ Promise.all
- 使用es7 的 async await
```js
const fs = require(‘fs‘)
function getData(path) {
return new Promise((resolve, reject) => {
fs.readFile(path, ‘utf8‘, (err, data) => {
if (err) return reject(err)
resolve(data)
})
})
}
// Promise.all([getData(‘./files/1.txt‘), getData(‘./files/2.txt‘), getData(‘./files/3.txt‘)]).then(res => {
// console.log(res)
// })
// 谁执行最快打印谁的结果,其他不执行
// Promise.race([getData(‘./files/1.txt‘), getData(‘./files/2.txt‘), getData(‘./files/3.txt‘)]).then(res => {
// console.log(res)
// })
// es7 async await
// async 和 await 必须配合使用
async function getFileData() {
const data1 = await getData(‘./files/1.txt‘)
const data2 = await getData(‘./files/2.txt‘)
const data3 = await getData(‘./files/3.txt‘)
console.log(data1)
console.log(data2)
console.log(data3)
}
getFileData()
```