利用promise封装异步读取文件
const fs = require('fs')
function read (url) {
return new Promise(((resolve, reject) => {
fs.readFile(url, 'utf8', function (err, data) {
if(err) reject(err);
resolve(data)
})
}))
}
read('./index.js').then(function (data) {
console.log(data)
}, function (err) {
console.log(err);
})
利用node的util中的promisify 将异步封装为promise
const fs = require('fs')
const util = require('util')
let read = util.promisify(fs.readFile);
read('./index.js', 'utf8').then(function (data) {
console.log(data);
}, function (err) {
console.log(err);
});
primise的链式操作
const fs = require('fs')
const util = require('util')
let read = util.promisify(fs.readFile);
read('./index.js', 'utf8').then(function (data) {
return read(data, 'utf8') //返回的是promise
}).then(res => {
console.log(res)
return res; //返回的是一个具体的值
}).then(data => {
console.log(data)
}).catch(() => {
// 处理错误,如果写了错误callback走自己的, 没写同走一个catch
});
async await
- await后面只能跟随promise
- async 函数总是返回一个 Promise 对象,所以你可以用then去处理结果
- 也可以在async函数中返回一个非promise 列如: return 'hello world';
async function f1() {
return 'hello world'
}
console.log(f1()); // 见下图
f1().then(res => console.log(res)) // 'helle world'
最优雅的写法
const fs = require('fs')
const util = require('util')
let read = util.promisify(fs.readFile);
async function result (url) {
let content1 = await read(url,'utf8'); // 这个没有结果不会向下执行
let content2 = await read(content1,'utf8');
return content2 + 'haha'
}
result(url).then((res) => console.log(res))
临时笔记
buffer (16进制)
1024b(字节) === 1k
1字节 === 8位(bit)
1个汉字(3字节)
// 深拷贝: JSON.parse(JSON.stringify(obj)),递归循环 这个会将函数丢失
// 浅拷贝: Object.assign() slice() [...[1,2,3]]
let arr = ['nan','fei','yan'];
let newArr = arr.slice(0);
arr[0] = 'liguigong';
console.log(newArr);
console.log(arr);
Promise.all的应用
async function result () {
let [name, age] = await Promise.all([read('a.txt','utf8'),read('b.txt','utf8')]);
console.log(name,age)
}