先上傳統文件載入方式代碼,傳統方式在處理多層嵌套時代碼比較混亂 第二階段 promsie 新建一個promise對象讀取文件成功是返回 resolve(data) 失敗是返回 rejext, promise.then里可以得到返回結果 co + generator function Generato ...
先上傳統文件載入方式代碼,傳統方式在處理多層嵌套時代碼比較混亂
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()