利用node的util中的promisify 将异步封装为promise

364 阅读1分钟

利用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

  1. await后面只能跟随promise
  2. async 函数总是返回一个 Promise 对象,所以你可以用then去处理结果
  3. 也可以在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)
}