解决地狱回调的问题

promise-API

为了解决地狱回调函数的问题,使用promise这样的API

var fs = require('fs')
//创建promise容器
//给别人一个承诺,承诺里面的任务是异步函数
var p1 = new Promise(function (resolve, reject) {
  fs.readFile('./data/a.txt', 'utf8', function (err, data) {
    if (err) {
      reject(err)//承诺容器中的任务失败了
      //容器中的pending状态变为rejected
      //调用了then中的第二个function函数
    } else {
      resolve(data)//承诺容器中的任务成功了
      //容器中的pending状态变为resolved
      //调用了then中的第一个function函数
    }
  })
})

var p2 = new Promise(function (resolve, reject) {
  fs.readFile('./data/b.txt', 'utf8', function (err, data) {
    if (err) {
      reject(err)
    } else {
      resolve(data)
    }
  })
})

var p3 = new Promise(function (resolve, reject) {
  fs.readFile('./data/c.txt', 'utf8', function (err, data) {
    if (err) {
      reject(err)
    } else {
      resolve(data)
    }
  })
})

//new Promise返回的是一个promise对象,
//这个对象有一个方法叫做then,在其原型对象上
//通过这then方法可以指定成功和失败的回调函数
//语法:promise.then(successCallback,errorCallback);

p1
  .then(function (data) {
    console.log(data)
    // 当 p1 读取成功的时候data
    // 当前函数中 return 的结果就可以在后面的 then 中 function 接收到resolved
    // 当你 return 123 后面就接收到 123
    //      return 'hello' 后面就接收到 'hello'
    //      没有 return 后面收到的就是 undefined
    // 上面那些 return 的数据没什么卵用
    // 真正有用的是:我们可以 return 一个 Promise 对象
    // 当 return 一个 Promise 对象的时候,后续的 then 中的 方法的第一个参数会作为 p2 的 resolve
    // 
    return p2//我们可以 return 一个 Promise 对象
  }, function (err) {
    console.log('读取文件失败了', err)
  })
  .then(function (data) {//p2中的resolve
    console.log(data)
    return p3
  })
  .then(function (data) {//p3中的resolve
    console.log(data)
    console.log('end')
  })

封装promise-API

var fs = require('fs')

function pReadFile(filePath) {
  return new Promise(function (resolve, reject) {
    fs.readFile(filePath, 'utf8', function (err, data) {
      if (err) {
        reject(err)
      } else {
        resolve(data)
      }
    })
  })
}

pReadFile('./data/a.txt')
  .then(function (data) {
    console.log(data)
    return pReadFile('./data/b.txt')
  })
  .then(function (data) {
    console.log(data)
    return pReadFile('./data/c.txt')
  })
  .then(function (data) {
    console.log(data)
  })

你可能感兴趣的:(node.js学习笔记)