js 是單線程的 通過異步實現多進程
async await 中文叫異步函數
async await 要點:1. await 後面可以追加 promise 對象,獲取 resolve 的值 2. await 必須包裹在 async 函數裏面 3. async 函數執行返回的也是一個 promise 對象 4. try-catch 截獲 promise 中 reject 的值
const fs = require('fs') //nodejs 的原生模塊
const path = require('path') //nodejs 的原生模塊
// callback 方式獲取一個文件的內容
function getFileContent(fileName, callback) {
const fullFileName = path.resolve(__dirname, 'files', fileName)
// __dirname當前的目錄
fs.readFile(fullFileName, (err, data) => {
if (err) {
console.error(err)
return
}
callback(
JSON.parse(data.toString())
)
})
}
// 測試 callback-hell 回調地獄
getFileContent('a.json', aData => {
console.log('a data', aData)
getFileContent(aData.next, bData => {
console.log('b data', bData)
getFileContent(bData.next, cData => {
console.log('c data', cData)
})
})
})
// 用 promise 獲取文件內容
function getFileContent(fileName) {
const promise = new Promise((resolve, reject) => {
const fullFileName = path.resolve(__dirname, 'files', fileName)
fs.readFile(fullFileName, (err, data) => {
if (err) {
reject(err)
return
}
resolve(
JSON.parse(data.toString())
)
})
})
return promise
}
//定義promise執行的順序
getFileContent('a.json').then(aData => {
console.log('a data', aData)
return getFileContent(aData.next)
}).then(bData => {
console.log('b data', bData)
return getFileContent(bData.next)
}).then(cData => {
console.log('c data', cData)
})
async function readFileData() {
// 同步寫法
try {
const aData = await getFileContent('a.json')
console.log('a data', aData)
const bData = await getFileContent(aData.next)
console.log('b data', bData)
const cData = await getFileContent(bData.next)
console.log('c data', cData)
} catch (err) {
console.error(err)
}
}
readFileData()
async function readAData() {
const aData = await getFileContent('a.json')
return aData
}
async function test() {
const aData = await readAData() // 這個函數返回的也是一個promise
console.log(aData)
}
test()