回调地狱

形如一下代码, 异步函数不断嵌套导致代码可读性和可维护性大幅下降,这就是回调地狱

    var fs = require('fs');
    
    fs.readFile('./doc/text.txt', (error, data) => {
        if (error)
            throw console.log('读取文件失败', error);
        console.log('读取文件成功', data);

        fs.readFile('./doc/text1.txt', (error, data) => {
            if (error)
                throw console.log('读取文件失败', error);
            console.log('读取文件成功', data);

            fs.readFile('./doc/text2.txt', (error, data) => {
                if (error)
                    throw console.log('读取文件失败', error);
                console.log('读取文件成功', data);

                fs.readFile('./doc/text3.txt', (error, data) => {
                    if (error)
                        throw console.log('读取文件失败', error);
                    console.log('读取文件成功', data);
                })
            })
        })
    })

Promise (解决回调地狱的方法)

promise 使传统的回调嵌套转化为回调链式, 优雅的解决了回调地狱造成的问题

var p = new Promise(function(resolve, reject) {});
var p1 = new Promise(function(resolve, reject) {});
var p2 = new Promise(function(resolve, reject) {});

    p.then((data) => {
        console.log('接收 resolve 的正常执行序列');
        console.log('读取文件成功', data);
        return p1; 
    })
    .then((data) => {
        console.log('接收 resolve 的正常执行序列');
        console.log('读取文件成功', data);
        return p2;

    })
    .then((data) => {
        console.log('接收 resolve 的正常执行序列');
        console.log('读取文件成功', data);
        return p2;

    })
    .catch((error) => {
        console.log('接收 reject 的异常执行序列');
        console.log('读取文件失败', error);
    })
    .finally(() => {
        console.log('最终执行')
    })

promise 应用

用 promise 封装 readFile 和 writeFile

exports.pReadFile = function (fileUrl) {
    return new Promise(function (resolve, reject) {
        console.log('开始执行 promise 实例的回调, 最先执行');

        // 异步函数
        fs.readFile(fileUrl, (error, data) => {
            if (error) reject(error);
            else {
                resolve(data.toString());
            }
        })

    })
}


exports.pWriteFile = function (fileUrl, content) {
    return new Promise(function (resolve, reject) {
        console.log('开始执行 promise 实例的回调, 最先执行');

        // 异步函数
        fs.writeFile(fileUrl, content, (error) => {
            if (error) reject(error);
            else resolve(1);
        })

    })
}

调用

pReadFile('./doc/text1.txt')
    .then((data) => {
        console.log('读取文件成功!', data);
        return pReadFile('./doc/text.txt');
    })
    .then((data) => {
        console.log('读取文件成功!', data);
    })
    .catch((err) => {
        console.log(typeof (err));
        console.log('读取失败!', err);
    })
    .finally(() => {
        console.log('最终执行')
    })