nodejs express中間件異步回調、koa中間件async await 未來趨勢

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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章