回调地狱问题

举一个文件操作的例子,先创建3个txt文件, a.txt,b.txt.c.txt  内容分别为  aaaa,bbbbb,cccc`

var fs = require('fs')

//文件操作是异步的   执行顺序不一定是按顺序执行
fs.readFile('./data/a.txt','utf8',function(err,data){
    if(err){
        //return console.log('读取失败')
        //抛出异常,阻止程序继续执行,把错误打印到控制台
        throw err;
    }
    console.log(data)
})

fs.readFile('./data/b.txt','utf8',function(err,data){
    if(err){
        //return console.log('读取失败')
        //抛出异常,阻止程序继续执行,把错误打印到控制台
        throw err;
    }
    console.log(data)
})

fs.readFile('./data/c.txt','utf8',function(err,data){
    if(err){
        //return console.log('读取失败')
        //抛出异常,阻止程序继续执行,把错误打印到控制台
        throw err;
    }
    console.log(data)
})

有时我们可能想要程序按照顺序执行

var fs = require('fs')

//在a回调函数种执行b,b的回调函数种执行c 这样就形成了多层嵌套,称为回调地狱
fs.readFile('./data/a.txt','utf8',function(err,data){
    if(err){
        //return console.log('读取失败')
        //抛出异常,阻止程序继续执行,把错误打印到控制台
        throw err;
    }
    console.log(data)
    fs.readFile('./data/b.txt','utf8',function(err,data){
        if(err){
            //return console.log('读取失败')
            //抛出异常,阻止程序继续执行,把错误打印到控制台
            throw err;
        }
        console.log(data)
        fs.readFile('./data/c.txt','utf8',function(err,data){
            if(err){
                //return console.log('读取失败')
                //抛出异常,阻止程序继续执行,把错误打印到控制台
                throw err;
            }
            console.log(data)
        })
    })
})

随之EcrameScript种出现了Promise这个api来解决这种回调嵌套的问题

下面是一个Promise的一个简单案例

//Promise是一个构造函数
var fs = require('fs')

/**
 * Promise容器中存放异步任务,有三个状态,
 * Pending(正在进行),
 * Resolved(成功)
 * Rejected(失败)
 * 执行结束只会有两种结果
 * Pending-->Resolved
 * Pending-->Rejected
 */

//创建Promise容器 一旦创建就会执行里面的代码
var p1 = new Promise(function(resolve,reject) {
    fs.readFile('./data/a.txt','utf8',function(err,data){
        if(err){
            reject('失败')
        }else{
            resolve(data) 
        }
    })
})

var p2 = new Promise(function(resolve,reject) {
    fs.readFile('./data/b.txt','utf8',function(err,data){
        if(err){
            reject('失败')
        }else{
            resolve(data) 
        }
    })
})

var p3 = new Promise(function(resolve,reject) {
    fs.readFile('./data/c.txt','utf8',function(err,data){
        if(err){
            reject('失败')
        }else{
            resolve(data) 
        }
    })
})

/*
    当p1执行成功的时候 当前函数种return的结果就可以在then的funtion中得到,
    也就是可以在then中的回调函数中得到
    return 123得到的就是123  没有return得到的就是undefined
    真正使用的话,我们是可以return一个Promise对象
    return 一个Promise对象时,后续的then中的第一个参数就是返回的Promise对象的resolve参数
*/
p1.then(function(data){
    console.log(data);
    return p2
},function(err){
    console.log(err);
})
.then(function(data){
    console.log(data);
    return p3
})
.then(function(data){
    console.log(data);
})

 

posted @ 2019-04-26 12:34  不爱笑青年  阅读(510)  评论(0编辑  收藏  举报