关于nodejs中的回调函数理解
2017-12-22 11:14
309 查看
Node的三个特点:单线程,非阻塞I/O,事件驱动。Node的编程思维就是,所有的都是异步的,因此有了大量的回调函数。
回调函数,就是放在另外一个函数(如 parent)的参数列表中,作为参数传递给这个 parent,然后在 parent 函数体的某个位置执行。举个栗子:
首先定义一个f1 函数,它有一个参数 callback,这个 callback 就是回调函数,名字可以任意取。
在函数体中,定义了三个变量 a,b,c。然后调用 callback 函数,最后返回一个值。这里我们并不知道callback这个回调函数是干什么的,因为没有定义它的功能,它只是有三个参数。
然后调用f1 函数,这时候我们就需要指定 callback 具体要实现什么了,可以看到,它完成了一个 求和的功能。
再比如,使用ejs模板,完成一个上传图片与查看相册的功能,我们可能这样做:
首先定义一个函数完成获取相册文件夹的功能:
然后调用函数并使用ejs渲染页面:
但是,这个做法是错误的,因为这是传统的思维!
在node中,你要时刻考虑你的代码功能是不是异步的,异步的,异步的。当你要获取所有的文件夹时,就要涉及到读文件,fs.readdir(),而这肯定是异步的!因此可能你的文件还没读完,页面就已经被渲染了,这时就会报错。
所以,正确的做法是,在getAllAlbums中使用callback回调函数,而在调用getAllAlbums时,把读完文件后的 数据 当做回调函数的 参数 来使用:
这样便能确保在读文件结束后才会渲染页面,即变异步为同步了。当然你也可以使用同步读文件操作。
ps:这里的示例代码并不完整,只是大概说明异步的思想,谢谢~
回调函数,就是放在另外一个函数(如 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:这里的示例代码并不完整,只是大概说明异步的思想,谢谢~
相关文章推荐
- 彻底理解NodeJs中的回调(Callback)函数
- Java回调函数理解
- 关于DC和SelectObject()函数的理解
- HA规范的理解3 - 初始化函数里的注册回调函数的分析
- 深入理解JavaScript的回调函数
- 关于cocos2dx3.0 cpp回调lua函数新方法
- 回调函数理解,需要整理
- 回调函数透彻理解Java
- 关于C++中在函数中按值返回、临时对象、拷贝构造函数的一点理解
- 关于opencv直方图计算函数 calcHist()的channels参数的理解
- 关于指针函数以及函数指针的一些理解
- NodeJS中将回调函数转换成Promise的例子
- 关于箭头函数的理解摘记
- Nodejs里面关于this指向的理解
- python-关于函数间参数传递问题(注意理解,很容易混淆)
- 关于JavaScript中函数的定义、对象以及对象实例化的理解
- 关于C++函数指针、函数回调的相关总结(重载与多态)
- 写协议解析程序的过程(关于通信解析函数的理解)
- 指针初学笔记(两个数交换的函数----关于指针的理解)
- 关于静态变量和函数粗浅理解(很粗,很浅)