異步編程
可以知道異步操作是不用管前面代碼是否執行的,他可以自己幹自己的
因此:
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)
})
此種方法一定是可以保證安裝順序執行的