node 中的 异步地狱回调
今天分享下node中的地狱回调(callback hell)
先看个例子
const fs = require("fs"); fs.readFile("./a.txt", "utf-8", (err, data) => { if (err) throw err; console.log(data) }) fs.readFile("./b.txt", "utf-8", (err, data) => { if (err) throw err; console.log(data) }) fs.readFile("./c.txt", "utf-8", (err, data) => { if (err) throw err; console.log(data) }) fs.readFile("./d.txt", "utf-8", (err, data) => { if (err) throw err; console.log(data) })
我们分别打开a.txt,b.txt,c.txt,d.txt
a.txt 文件中写入aaaaa
b.txt 文件中写入bbbbb
c.txt 文件中写入ccccc
d.txt文件中写入ddddd
因为我们上篇博文中讲解了 异步的执行顺序是不确定的 所以执行出来可能是
aaaaa
ccccc
bbbbb
ddddd
也可能是
aaaaa
bbbbb
ddddd
ccccc
所以当我们想要读取文件按照顺序执行,可以用嵌套的方法如
const fs = require("fs"); fs.readFile("./a.txt", "utf-8", (err, data) => { if (err) throw err; console.log(data); fs.readFile("./b.txt", "utf-8", (err, data) => { if (err) throw err; console.log(data); }) })
这样执行顺序就是 aaaaaa bbbbbb 我们分别把读取c文件和d文件都嵌套到里面
const fs = require("fs"); fs.readFile("./a.txt", "utf-8", (err, data) => { if (err) throw err; console.log(data); fs.readFile("./b.txt", "utf-8", (err, data) => { if (err) throw err; console.log(data); fs.readFile("./c.txt", "utf-8", (err, data) => { if (err) throw err; console.log(data); fs.readFile("./d.txt", "utf-8", (err, data) => { if (err) throw err; console.log(data); }) }) }) })
这样我们执行完代码就会按照顺序执行也就是
aaaaaa
bbbbbb
cccccc
dddddd
我们可以回过头来观察一下目前的代码,虽然实现了按照顺序执行的目的,可是代码非常的乱,为了让大家更加直观的体验 我们在增加几个读取文件的操作
随着读取的文件越来越多,我们发现需要嵌套的层数也越来越多,网上有一个非常出名的图片
这就是地狱回调的案例,缺点很明显:代码嵌套越来越多,维护起来要人命,还很容易出现错误,所以我们不要写出这样的代码,下一篇会介绍如何解决地狱回调嵌套的问题