Promise 解决回调地狱问题

需求: 封装一个根据文件名读取文件内容的方法,然后依次读取三个文件

const fs = require('fs');
const path = require('path');

function getFileByPath(path, succCallback, failCallback) {
    fs.readFile(path, 'utf-8', (err, data) => {
        if (err) {
            return failCallback(err.message);
        }
        succCallback(data);
    });
}

getFileByPath(path.join(__dirname, './1.txt'), function(data) {
    console.log(data);
    getFileByPath(path.join(__dirname, './2.txt'), function(data) {
        console.log(data);
        getFileByPath(path.join(__dirname, './3.txt'), function(data) {
            console.log(data);
        });
    });
});

问题,回调嵌套太深,回调地狱

使用 es6 中的 Promise 来解决问题

  • Promise 是一个构造函数,新建的实例代表一个异步操作,实例化时构造函数接收一个函数作为参数,函数中写你要做的异步操作,函数有两个参数,resolve (异步操作成功时执行)和reject(异步操作失败时执行) ,这两个函数在 实例.then() 中去定义
let promise = new Promise(function(resolve, reject) {
    fs.readFile(path.join(__dirname, './11.txt'), 'utf-8', (err, data) => {
        if (err) {
            return reject(err);
        }
        resolve(data);
    });
});
promise.then(function(data) {
    console.log('resolve:' + data);
}, function(err) {
    console.log('reject:' + err.message);
});

注意:在实例 promise 对象时,传入函数中的异步操作代码会立刻开始执行

  • 如果我们在 对象.then中返回一个promise对象,就可以一直使用 .then 方法完成我们的需求
function getFileByPath(path) {
    return new Promise((resolve, reject) => {
        fs.readFile(path, 'utf-8', (err, data) => {
            if (err) {
                return reject(err);
            }
            resolve(data);
        });
    });
}
getFileByPath(path.join(__dirname, './1.txt'))
    .then(function(data) {
        console.log(data);
        return getFileByPath(path.join(__dirname, './2.txt'));
    }).then(function(data) {
        console.log(data);
        return getFileByPath(path.join(__dirname, './3.txt'));
    }).then(function(data) {
        console.log(data);
    }).catch(function(err) {
        console.log(err.message);
    });
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容