异步编程之回调地狱嵌套

异步编程

可以知道异步操作是不用管前面代码是否执行的,他可以自己干自己的

因此:

var fs = require('fs')

fs.readFile('./data/a.txt', 'utf8', function (err, data) {
  if (err) {
    // return console.log('读取失败')
    // 抛出异常
    //    1. 阻止程序的执行
    //    2. 把错误消息打印到控制台
    throw err
  }
  console.log(data)
})

fs.readFile('./data/b.txt', 'utf8', function (err, data) {
if (err) {
  // return console.log('读取失败')
  // 抛出异常
  //    1. 阻止程序的执行
  //    2. 把错误消息打印到控制台
  throw err
}
console.log(data)
})	
    
fs.readFile('./data/c.txt', 'utf8', function (err, data) {
  if (err) {
    // return console.log('读取失败')
    // 抛出异常
    //    1. 阻止程序的执行
    //    2. 把错误消息打印到控制台
    throw err
  }
  console.log(data)
})

这种方式无法保证每一次都是读取到a>b>c这样的顺序

于是就有了回调地狱嵌套

Promise

为了解决以上编码带来的问题(回调地狱嵌套),所以在EcmaScript6中新增了一个API:promise

var fs = require('fs')

// 创建一个 Promise 容器
  // Promise 容器一旦创建,就开始执行里面的代码
  // 承诺本身不是异步,仅仅是一个容器,只是在容器中封装异步任务

// 对promise进行封装
function pReadFile(filePath){
  return new Promise(function(resolve, reject){
    fs.readFile(filePath, 'utf8', function(err, data){
      if(err)
        reject(err) // 把容器的 Pending 状态变为Rejected
      else
        resolve(data) // 把容器的 Pending 状态变为Resolved
    })
  })
}
	// 当 p1 读取成功的时候
    // 当前函数中 return 的结果就可以在后面的 then 中 function 接收到
    //      return 'hello' 后面就then接会收到 'hello'
    //      没有 return 后面收到的就是 undefined
    // 我们可以 return 一个 Promise 对象
    // 当 return 一个 Promise 对象的时候,后续的 then 中的 方法的第一个参数会作为 p2 的 resolve

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)
  })

此种方法一定是可以保证安装顺序执行的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章