callback、promise和async、await的使用方法


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();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM