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

我们可以回过头来观察一下目前的代码,虽然实现了按照顺序执行的目的,可是代码非常的乱,为了让大家更加直观的体验 我们在增加几个读取文件的操作

 

 随着读取的文件越来越多,我们发现需要嵌套的层数也越来越多,网上有一个非常出名的图片

 

 这就是地狱回调的案例,缺点很明显:代码嵌套越来越多,维护起来要人命,还很容易出现错误,所以我们不要写出这样的代码,下一篇会介绍如何解决地狱回调嵌套的问题

posted @ 2021-03-07 13:33  珊迪·奇克斯  阅读(178)  评论(0编辑  收藏  举报