关于nodejs中的回调函数理解

Node的三个特点:单线程,非阻塞I/O,事件驱动。Node的编程思维就是,所有的都是异步的,因此有了大量的回调函数。

回调函数,就是放在另外一个函数(如 parent)的参数列表中,作为参数传递给这个 parent,然后在 parent 函数体的某个位置执行。举个栗子:

var f1 = function(callback)
{
    var a = 1,
        b = 2,
        c = 3;
    var s = callback(a,b,c);
    return s;
};
var d = f1(function(x,y,z){
    return (x+y+z);
});
console.log(d);

首先定义一个f1 函数,它有一个参数 callback,这个 callback 就是回调函数,名字可以任意取。

在函数体中,定义了三个变量 a,b,c。然后调用 callback 函数,最后返回一个值。这里我们并不知道callback这个回调函数是干什么的,因为没有定义它的功能,它只是有三个参数。

然后调用f1 函数,这时候我们就需要指定 callback 具体要实现什么了,可以看到,它完成了一个 求和的功能。

再比如,使用ejs模板,完成一个上传图片与查看相册的功能,我们可能这样做:

首先定义一个函数完成获取相册文件夹的功能:

function getAllAlbums(){

    //这里具体实现功能,最后返回一个文件夹数组
    fs.readdir(...)

}

然后调用函数并使用ejs渲染页面:

var albums = function(req,res,next){

    res.render("index",{
        "albums" : getAllAlbums()
    });

}

但是,这个做法是错误的,因为这是传统的思维!

在node中,你要时刻考虑你的代码功能是不是异步的,异步的,异步的。当你要获取所有的文件夹时,就要涉及到读文件,fs.readdir(),而这肯定是异步的!因此可能你的文件还没读完,页面就已经被渲染了,这时就会报错。

所以,正确的做法是,在getAllAlbums中使用callback回调函数,而在调用getAllAlbums时,把读完文件后的 数据 当做回调函数的 参数 来使用:

function getAllAlbums(callback){

    fs.readdir("./uploads",function(err,files){
        var allAlbums = [];
        ...
        callback(allAlbums);
    }

}
var albums = function(req,res,next){

    getAllAlbums(function(err,allAlbums){
        res.render("index",{
            "albums" : allAlbums
        });
    })

}

这样便能确保在读文件结束后才会渲染页面,即变异步为同步了。当然你也可以使用同步读文件操作。

ps:这里的示例代码并不完整,只是大概说明异步的思想,谢谢~

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值