異步編程之回調地獄嵌套

異步編程

可以知道異步操作是不用管前面代碼是否執行的,他可以自己幹自己的

因此:

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

此種方法一定是可以保證安裝順序執行的

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