2.6.JavaScript异步流程控制-Promise的第三方封装

139 阅读1分钟
  • 使用第三方封装的promise
  • bluebird.promisify,函数的promise化

case.js

let fs = require('fs');
let bulebird = require('bluebird');
// bluebird对fs.readFile进行Promise化
let read = bulebird.promisify(fs.readFile);
read('name.txt', 'utf8').then(data => {
  return read(data, 'utf8');
}).then(data => {
  console.log(data);
}).catch(err => {
  console.log(`err ${err}`);
});
// 对fs对象里的所有函数进行Promise化 fs.readFileAsync fs.writeFileAsync
bulebird.promisifyAll(fs);
fs.readFileAsync('name.txt', 'utf8').then(data => {
  return fs.readFileAsync('age.txt', 'utf8')
}).then(data => {
  console.log(data);
})

  • 自定义promisify方法

case1.js

let fs = require('fs');
let bluebird = {
  promisify(fn) {
    return function (...args) {
      return new Promise((resolve, reject) => {
        // Node异步方法最后一个参数都是回调函数
        fn(...args, function (err, data) {
          if (err) reject(err);
          resolve(data);
        })
      })
    }
  },
  promisifyAll(obj) {
    for (let key in obj) {
      obj[key + 'Async'] = this.promisify(obj[key]);
    }
  }
}
// 对单个函数进行promis化
let read = bluebird.promisify(fs.readFile);
read('name.txt', 'utf8').then(data => {
  console.log(data);
})
// 对对象内所有函数进行promis化
bluebird.promisifyAll(fs);
fs.readFileAsync('name.txt', 'utf8').then(data => {
  console.log(data);
})