美文网首页
Promise 解决回调地狱问题

Promise 解决回调地狱问题

作者: hgzzz | 来源:发表于2018-11-13 12:58 被阅读0次

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

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

    相关文章

      网友评论

          本文标题:Promise 解决回调地狱问题

          本文链接:https://www.haomeiwen.com/subject/lrgkfqtx.html