Promise 解决回调地狱问题

2018-11-13  本文已影响0人  hgzzz

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

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 来解决问题

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 对象时,传入函数中的异步操作代码会立刻开始执行

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);
    });
上一篇下一篇

猜你喜欢

热点阅读