JavaScript异步
在项目根目录有files文件夹和index.js,在files文件夹里有a.json、b.json、c.json三个文件,要按顺序获取它们的内容
index.js:
const fs = require('fs')
const path = require('path')
// 按顺序获取文件内容
// 一、不封装函数:
const fullFileName = path.resolve(__dirname, "files", "a.json") //拼出文件绝对路径
fs.readFile(fullFileName, (err, data) => {
if (err) {
console.error(err)
return
}
console.log('aDataObj', JSON.parse(data.toString())) //data默认是二进制,需要转字符串,再转成json对象
const fullFileName = path.resolve(__dirname, "files", "b.json") //拼出文件绝对路径
fs.readFile(fullFileName, (err, data) => {
if (err) {
console.error(err)
return
}
console.log('bDataObj', JSON.parse(data.toString())) //data默认是二进制,需要转字符串,再转成json对象
const fullFileName = path.resolve(__dirname, "files", "c.json") //拼出文件绝对路径
fs.readFile(fullFileName, (err, data) => {
if (err) {
console.error(err)
return
}
console.log('cDataObj', JSON.parse(data.toString())) //data默认是二进制,需要转字符串,再转成json对象
})
})
})
// 二、用原生js的callback-hell方式:
// callback只是一个参数,代表要传入的函数
function getFileContent(fileName, callback) {
const fullFileName = path.resolve(__dirname, "files", fileName) //拼出文件绝对路径
fs.readFile(fullFileName, (err, data) => {
if (err) {
console.error(err)
return
}
// 接下来调用传入的函数,并且给这个函数传入参数:
callback(JSON.parse(data.toString())) //data默认是二进制,需要转字符串,再转成json对象
})
}
getFileContent('a.json', aDataObj => {
console.log('aDataObj', aDataObj)
getFileContent(aDataObj.next, bDataObj => {
console.log('bDataObj', bDataObj)
getFileContent(bDataObj.next, cDataObj => {
console.log('cDataObj', cDataObj)
})
})
})
// 三、使用promise:
function getFileContent(fileName) {
// 使用new Promise来初始化一个Promise对象
const promise = new Promise((resolve, reject) => {
const fullFileName = path.resolve(__dirname, "files", fileName) //拼出文件绝对路径
fs.readFile(fullFileName, (err, data) => {
if (err) {
reject(err)
return
}
resolve(
JSON.parse(data.toString())) //data默认是二进制,需要转字符串,再转成json对象
})
})
return promise
}
getFileContent('a.json').then(aDataObj => {
console.log('aDataObj', aDataObj) //aDataObj就是resolve中传入的参数
return getFileContent(aDataObj.next)
}).then(bDataObj => {
console.log('bDataObj', bDataObj)
return getFileContent(bDataObj.next)
}).then(cDataObj => {
console.log('cDataObj', cDataObj)
}) //把callback的嵌套变成了.then的平铺
// 四、async和await,koa2原生支持
a.json:
{
"next": "b.json",
"msg": "this is a"
}
b.json:
{
"next": "c.json",
"msg": "this is b"
}
c.json:
{
"next": null,
"msg": "this is c"
}
每次保留index.js中的一种方法,其他的注释掉,观察运行结果
在项目根目录下,运行index.js:
node index.js

浙公网安备 33010602011771号