一、使用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()