nodejs中的异步编程 顺序执行异步方法的方法^_^

本文共有4148个字,页面加载耗时0.001秒,关键词:
现在项目下有三个文件(1.txt 2.txt 3.txt)内容分别为 “1”,“2”,“3”;
我们需要使用fs.readFile方法来依次读取他们的内容

实验环境:node v12.13.0

1.使用连续的回调函数(回调地狱 ̄□ ̄||)

思路:在读取文件的时候在其回调函数中再进行读取下一个文件。

//引入文件操作库
const fs = require('fs');

// 读取文件1
fs.readFile('./1.txt', 'utf8', (err1, res1) => {
    if (err1 !== null) {
        //文件1的错误处理
        console.log(err1);
    } else {
        //处理文件1的内容
        console.log(res1);
        //读取文件2
        fs.readFile('./2.txt', 'utf8', (err2, res2) => {
            if (err2 !== null) {
                //文件2的错误处理
                console.log(err2);
            } else {
                //处理文件2的内容
                console.log(res2);
                //读取文件3
                fs.readFile('./3.txt', 'utf8', (err3, res3) => {
                    if (err3 !== null) {
                        //文件3的错误处理
                        console.log(err3);
                    } else {
                        //处理文件3的内容
                        console.log(res3);
                    }
                })
            }
        })
    }
})

执行结果

> 1
> 2
> 3

2.使用Promise

//引入文件操作库
const fs = require('fs');
/* 使用Promise */
const p1 = () => {
    return new Promise((resolve, reject) => {
        fs.readFile('./1.txt', 'utf8', (err, res) => {
            if (err !== null) {
                reject(err);
            } else {
                resolve(res);
            }
        })
    })
};

const p2 = () => {
    return new Promise((resolve, reject) => {
        fs.readFile('./2.txt', 'utf8', (err, res) => {
            if (err !== null) {
                reject(err);
            } else {
                resolve(res);
            }
        })
    })
};
const p3 = () => {
    return new Promise((resolve, reject) => {
        fs.readFile('./3.txt', 'utf8', (err, res) => {
            if (err !== null) {
                reject(err);
            } else {
                resolve(res);
            }
        })
    })
};

p1().catch(err => console.log(err))
    .then((res) => {
        console.log(res);
        return p2();
    })
    .catch(err => console.log(err))
    .then((res) => {
        console.log(res);
        return p3();
    })
    .catch(err => console.log(err))
    .then((res) => {
        console.log(res);
    })

执行结果

> 1
> 2
> 3

3.使用async await关键字

/* 使用async */
const p1 = () => {
    return new Promise((resolve, reject) => {
        fs.readFile('./1.txt', 'utf8', (err, res) => {
            if (err !== null) {
                reject(err);
            } else {
                resolve(res);
            }
        })
    })
};
const p2 = () => {
    return new Promise((resolve, reject) => {
        fs.readFile('./2.txt', 'utf8', (err, res) => {
            if (err !== null) {
                reject(err);
            } else {
                resolve(res);
            }
        })
    })
};
const p3 = () => {
    return new Promise((resolve, reject) => {
        fs.readFile('./3.txt', 'utf8', (err, res) => {
            if (err !== null) {
                reject(err);
            } else {
                resolve(res);
            }
        })
    })
};

const run = async() => {
    try {
        let r1 = await p1();
        let r2 = await p2();
        let r3 = await p3();
        console.log(r1);
        console.log(r2);
        console.log(r3);
    } catch (e) {
        console.log(e);
    }
}
run();

4.使用util.promisify()

/* 使用promisify */
//引用util模块里面的promisify
const promisify = require('util').promisify;
const readFile = promisify(fs.readFile);

const run = async() => {
    try {
        let r1 = await readFile('./11.txt', 'utf8');
        let r2 = await readFile('./2.txt', 'utf8');
        let r3 = await readFile('./3.txt', 'utf8');
    } catch (e) {
        console.log(e);
        return;

    }
    console.log(r1);
    console.log(r2);
    console.log(r3);
}
run();

小白笔记,若有错误,还请留言斧正?

扫码在手机查看