1. 程式人生 > >node傳統讀取文件和promise,async await,

node傳統讀取文件和promise,async await,

require yield ise 異步 cti adas reject ext 引入

先上傳統文件加載方式代碼,傳統方式在處理多層嵌套時代碼比較混亂

const fs = require(fs)  //引入文件系統 

function readFile (cb) {
    fs.readFile(./package.json,(err,data) => {
        if(err) return console.log(err)     
        cb(null,data)
    })
}
//回調函數
readFile((err, data) => {
    if(!err) {
        data = JSON.parse(data)
        console.log(data.name)
    }
})

第二階段 promsie 新建一個promise對象讀取文件成功是返回 resolve(data) 失敗是返回 rejext, promise.then裏可以得到返回結果

function readfileAsync (path) {
    return new Promise((resolve,reject) => {  
        fs.readFile(path,(err,data) => {
            if(err){
                 reject(err)
            } else {
                 resolve(data)
            }         
        })
    })
}

readfileAsync(
./package.json).then(data => { data = JSON.parse(data) console.log(data.name) }) .catch(err => { console.log(err); })

co + generator function

Generator (*)函數是一個普通函數,但是有兩個特征。一是,function關鍵字與函數名之間有一個星號;二是,函數體內部使用yield表達式,定義不同的內部狀態,每次調用

解釋generator函數執行的簡單方法

function* helloWorldGenerator() {
  
yield hello; yield world; return ending; } var hw = helloWorldGenerator(); hw.next() // { value: ‘hello‘, done: false } hw.next() // { value: ‘world‘, done: false } hw.next() // { value: ‘ending‘, done: true } hw.next() // { value: undefined, done: true }

co.js 保證 *函數中的 yield方法輪循執行,每次執行均返回的是promise對象,這裏同時使用 node中的util方法中的promisify 代替傳統的promise,nodejs8.0以上

const util = require(util)

const co = require(co)

co(function *() { 
    let data = yield util.promisify(fs.readFile)(./package.json) //使用node util 中的promisify實例化 fs.readFile方法同時直接返回結果
    data = JSON.parse(data)
    console.log(data.name)
})

async 加載方式 nodejs7.6以上版本 用async await 把異步加載方式同步的寫法實現,實際上是對 promsie的封裝

const util = require(util)
const readAsync = util.promisify(fs.readFile)

async function init () {
    let data = await readAsync(./package.json)
    
    data = JSON.parse(data)
    console.log(data.name)
}

init()

node傳統讀取文件和promise,async await,