callback
回調是一個函數被作為一個參數傳遞到另一個函數里,在那個函數執行完后再執行。
通俗的講就是 B函數被作為參數傳遞到A函數里,在A函數執行完后再執行B。
promise
Promise 是異步編程的一種解決方案,比傳統的解決方案——回調函數和事件——更合理和更強大,ES6規定,Promise對象是一個構造函數,用來生成Promise實例。Promise實例具有then方法,也就是說,then方法是定義在原型對象Promise.prototype上的。
async/await
它就是 Generator 函數的語法糖。可以結合promise 使用。
async函數返回一個 Promise 對象,可以使用then方法添加回調函數。當函數執行的時候,一旦遇到await就會先返回,去處理其他操作,等到異步操作完成,再接着執行函數體內后面的語句。
async函數返回一個 Promise 對象。async函數內部return語句返回的值,會成為then方法回調函數的參數。
現在寫一個獲取其他文件的內容的方法,分別使用callback、promise和async/await實現
新建一個文件夾,取名files里面建三個json文件a.json、b.json、c.json,內容分別為 :
a.json :
{ "next": "b.json", "msg": "this is a" }
b.json :
{ "next": "c.json", "msg": "this is b" }
c.json
{ "next": null, "msg": "this is c" }
然后使用callback獲取文件的內容:
const fs = require("fs"); const path = require("path"); // callback 方式獲取一個文件的內容 function getFileContent(fileName, callback) { const fullFileName = path.resolve(__dirname, "files", fileName); fs.readFile(fullFileName, (err, data) => { if (err) { console.error(err); return; } callback(JSON.parse(data.toString())); }) } //使用 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獲取文件內容:
//基於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; } //使用 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/await獲取文件內容
//使用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; } //使用 async function readFileData() { 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); } readFileData();