解决回调地狱的问题

一、使用callback()获取异步函数的返回值

function getMsg( callback ) {
    setTimeout(function () {
        //对这个函数进行调用,将这个对象作为参数传递进去
        callback({msg:"hello nodejs"})
    },2000)
}

getMsg( function (obj) {
    console.log(obj) //结果是:{msg:"hello nodejs"}
} )

二、使用callback()返回异步函数的值会造成回调地狱(hell)的问题,所以使用promise解决回调地狱的问题

const fs = require("fs")
//回调函数嵌套回调函数,就是回调地狱问题
fs.readFile("./1.txt","utf8",(err,result1)=>{
    console.log(result1)

    //继续读第二个
    fs.readFile("./2.txt","utf8",(err,result2)=>{
        console.log(result2)

        //继续第三个
        fs.readFile("./3.txt","utf8",(err,result3)=>{
            console.log(result3)
        })
    })
})

解决方法1:
const fs = require("fs")
function p1() {
    return new Promise( (resolve,reject)=>{
        fs.readFile("./1.txt","utf8",(err,result)=> {
            //文件读取成功,则调用resolve
            resolve(result)
        })
    } )
}

function p2() {
    return new Promise( (resolve,reject)=>{
        fs.readFile("./2.txt","utf8",(err,result)=> {
            //文件读取成功,则调用resolve
            resolve(result)
        })
    } )
}

function p3() {
    return new Promise( (resolve,reject)=>{
        fs.readFile("./3.txt","utf8",(err,result)=> {
            //文件读取成功,则调用resolve
            resolve(result)
        })
    } )
}
p1().then( result1=>{
    console.log(result1)
    //返回p2()函数中的promise对象
    return p2()
}).then( result2=>{
    console.log(result2)
    return p3()
} ).then( result3=>{
    console.log(result3)
} )

解决方法二:
const fs = require("fs")
const promisify =  require("util").promisify
const readFile = promisify( fs.readFile )

async function run() {
    //这个readFile异步函数中,会自动调用回调函数,带回结果
    let r1 = await readFile("./1.txt",'utf8')
    let r2 = await readFile("./2.txt",'utf8')
    let r3 = await readFile("./3.txt",'utf8')
    console.log( r1 )
    console.log( r2 )
    console.log( r3 )
}
run()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值