skip to content

JavaScript
JavaScript 异步编程的变化

fs.readFile 为例

  1. 第一阶段 callback
const fs = require('fs')
const packagePath = './package.json'

function readFile(path, cb) {
  fs.readFile(path, (err, data) => {
    !err ? cb(null, data) : cb(err)
  })
}

readFile(packagePath, function (err, data) {
  if (!err) {
    data = JSON.parse(data)
    console.log(data.name)
  } else {
    console.log(err)
  }
})
  1. 第二阶段 利用 Promise 包装
function readFileProm(path) {
  return new Promise((resolve, reject) => {
    fs.readFile(path, (err, data) => {
      !err ? resolve(data) : reject(err)
    })
  })
}

readFileProm(packagePath)
  .then(res => {
    res = JSON.parse(res)
    console.log(res.name)
  })
  .catch(err => console.log(err))
  1. 第三阶段 co + Generator
const util = require('util')
const co = require('co')
const readFilePromisify = util.promisify(fs.readFile)

co(function* () {
  let data = yield readFilePromisify(packagePath)
  data = JSON.parse(data)
  console.log(data.name)
})
  1. 第四阶段 async await
async function run(path) {
  let data = await readFilePromisify(path)
  data = JSON.parse(data)
  console.log(data.name)
}
run(packagePath)