NodeJS学习笔记 —— 回调函数与callback hell
什么是回调函数
编程分为两类:系统编程(system programming)和应用编程(application programming)。所谓系统编程,简单来说,就是编写库;而应用编程就是利用写好的各种库来编写具某种功用的程序,也就是应用。系统程序员会给自己写的库留下一些接口,即API(application programming interface,应用编程接口),以供应用程序员使用。所以在抽象层的图示里,库位于应用的底下。
当程序跑起来时,一般情况下,应用程序会时常通过API调用库里所预先备好的函数。但是有些库函数(即中间函数)却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务。这个被传入的、后又被调用的函数就称为回调函数(callback function)。中间函数和回调函数是回调的两个必要部分,不过人们往往忽略了回调里的第三位要角,就是中间函数的调用者。绝大多数情况下,这个调用者可以和程序的主函数等同起来,但为了表示区别,我这里把它称为起始函数。
链接:https://www.zhihu.com/question/19801131/answer/27459821
来源:知乎
简单来说,回调函数可以解释为“If you call me, I will call you back.” 起始函数调用中间函数,中间函数又需调用作为参数传入的回调函数。
由于nodejs的程序是异步的,想进行阻塞式编程顺序执行,可以借助callback函数实现。通常网络通信、读写文件、与数据库交互等 IO操作会使用回调函数,需要消耗一些时间才能返回结果。
Nodejs中的回调函数
下面展示了最简单的回调函数,其中x作为回调函数被中间函数y调用
let x=function(){console.log("i am called from inside a function")
};let y=function(callback){console.log('do something');callback();
}y(x);
运行结果:
do something
i am called from inside a function
再看一个例子:
// getTodos函数定义
const getTodos = function(callback){setTimeout(function(){ //调用应用层的setTimeout函数,并传入callback函数console.log('运行了3s');console.log('2');callback('回调函数');console.log('运行完毕');},3000);
};console.log('1')
// 执行getTodos函数,并传入callback函数
getTodos(function(data){console.log(data);
});
console.log('3')
程序运行后输出结果为:
1
3
运行了3s
2
回调函数
运行完毕
想要的结果为:1 => 运行3s => 2 => 3
因此需要将下面的函数放到回调函数中,修改为:
// getTodos函数定义
const getTodos = function(callback){setTimeout(function(){ //调用应用层的setTimeout函数,并传入callback函数console.log('运行了3s');console.log('2');callback('回调函数');console.log('运行完毕');},3000);
};console.log('1')
// 执行getTodos函数,并传入callback函数
getTodos(function(data){console.log(data);console.log('3') // 放进回调函数中
});
运行后输出结果为:
1
运行了3s
2
回调函数
3
运行完毕
总结:执行callback函数作用:实现阻塞式编程,按顺序执行原程序与callback函数
Callback hell
在编写 js 程序时,有时候会需要几个回调函数嵌套,不仅程序看起来臃肿,也大大增大了代码的维护难度,被称为"回调地狱"(Callback hell)。如下图所示,是个经典的 Callback hell(回调地狱):
NodeJS学习笔记 —— 回调函数与callback hell相关推荐
- Nodejs学习笔记(六)——Mysql模块
[目录] Nodejs学习笔记(一)--基础之全局对象.包和npm Nodejs学习笔记(二)--模块 Nodejs学习笔记(三)--同步和与异步之文件系统模块 Nodejs学习笔记(四)--http ...
- nodejs学习笔记(上)
nodejs学习笔记 (上) 通过学习需要做到的是 了解 前后端是如何进行交互的 nodejs也是使用javaScript进行编写的 javaScript在不同的运行环境中有不同的作用 在浏览器内核中 ...
- 好程序员web前端分享Nodejs学习笔记之Stream模块
好程序员web前端分享Nodejs学习笔记之Stream模块 一,开篇分析 流是一个抽象接口,被 Node 中的很多对象所实现.比如对一个 HTTP 服务器的请求是一个流,stdout 也是一个流.流 ...
- Nodejs学习笔记(四)——http协议与服务器
[目录] Nodejs学习笔记(一)--基础之全局对象.包和npm Nodejs学习笔记(二)--模块 Nodejs学习笔记(三)--同步和与异步之文件系统模块 Nodejs学习笔记(五)--expr ...
- Nodejs学习笔记(二)——模块
[目录] Nodejs学习笔记(一)--基础之全局对象.包和npm Nodejs学习笔记(三)--同步和与异步之文件系统模块 Nodejs学习笔记(四)--http协议与服务器 Nodejs学习笔记( ...
- python 回调函数(Callback)
什么是回调函数?我们绕点远路来回答这个问题.编程分为两类:系统编程(system programming)和应用编程(application programming).所谓系统编程,简单来说,就是编写 ...
- JavaScript中的回调函数(callback)
前言 callback,大家都知道是回调函数的意思.如果让你举些callback的例子,我相信你可以举出一堆.但callback的概念你知道吗?你自己在实际应用中能不能合理利用回调实现功能? 我们在平 ...
- Nodejs学习笔记(一)——基础之全局对象、包和npm
[目录] Nodejs学习笔记(二)--模块 Nodejs学习笔记(三)--同步和与异步之文件系统模块 Nodejs学习笔记(四)--http协议与服务器 Nodejs学习笔记(五)--express ...
- JavaScript:回调函数(callback)
前言 callback,大家都知道是回调函数的意思.如果让你举些callback的例子,我相信你可以举出一堆.但callback的概念你知道吗?你自己在实际应用中能不能合理利用回调实现功能? 我们在平 ...
最新文章
- 话AI、学实践、探未来,亚马逊云科技AI在线大会报名开启!
- minicom指令_【教程】minicom使用教程
- C语言数组作为传入参数
- 登录:应用程序错误通知
- php7 验证url格式,url的组成格式为
- ARToolKit从图片生成特征点数据
- Redis学习总结(9)——Redis常见面试题汇总
- (林雷看来13):功能优先,发展和重建同步,业绩后
- c语言有趣的编程代码,一个有趣的小程序
- 谷歌 Daydream VR 开发工具
- 少儿编程、软硬编程课件、创意Scratch的项目小游戏,可单独上一节课
- MATLAB 【学习视频推荐】——新手必备
- 河北省农村居民家庭平均每百户家用计算机拥有量,2013-2015年全国居民家庭平均每百户计算机拥有量统计...
- 【Choco Disco】MMD镜头+动作打包下载.zip
- Windows 桌面主题 1.2
- 前端js——金山打字通小游戏(屏幕随机下落字母,获取键盘按键)
- verilog对信号二分频 时钟分频信号作为时钟使能信号
- 助力全球抗疫,腾讯加入Linux基金会公共卫生计划
- 学习用 JS/CSS 画一个时钟
- SIP协议详解(中文)-1