什么是回调函数

编程分为两类:系统编程(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相关推荐

  1. Nodejs学习笔记(六)——Mysql模块

    [目录] Nodejs学习笔记(一)--基础之全局对象.包和npm Nodejs学习笔记(二)--模块 Nodejs学习笔记(三)--同步和与异步之文件系统模块 Nodejs学习笔记(四)--http ...

  2. nodejs学习笔记(上)

    nodejs学习笔记 (上) 通过学习需要做到的是 了解 前后端是如何进行交互的 nodejs也是使用javaScript进行编写的 javaScript在不同的运行环境中有不同的作用 在浏览器内核中 ...

  3. 好程序员web前端分享Nodejs学习笔记之Stream模块

    好程序员web前端分享Nodejs学习笔记之Stream模块 一,开篇分析 流是一个抽象接口,被 Node 中的很多对象所实现.比如对一个 HTTP 服务器的请求是一个流,stdout 也是一个流.流 ...

  4. Nodejs学习笔记(四)——http协议与服务器

    [目录] Nodejs学习笔记(一)--基础之全局对象.包和npm Nodejs学习笔记(二)--模块 Nodejs学习笔记(三)--同步和与异步之文件系统模块 Nodejs学习笔记(五)--expr ...

  5. Nodejs学习笔记(二)——模块

    [目录] Nodejs学习笔记(一)--基础之全局对象.包和npm Nodejs学习笔记(三)--同步和与异步之文件系统模块 Nodejs学习笔记(四)--http协议与服务器 Nodejs学习笔记( ...

  6. python 回调函数(Callback)

    什么是回调函数?我们绕点远路来回答这个问题.编程分为两类:系统编程(system programming)和应用编程(application programming).所谓系统编程,简单来说,就是编写 ...

  7. JavaScript中的回调函数(callback)

    前言 callback,大家都知道是回调函数的意思.如果让你举些callback的例子,我相信你可以举出一堆.但callback的概念你知道吗?你自己在实际应用中能不能合理利用回调实现功能? 我们在平 ...

  8. Nodejs学习笔记(一)——基础之全局对象、包和npm

    [目录] Nodejs学习笔记(二)--模块 Nodejs学习笔记(三)--同步和与异步之文件系统模块 Nodejs学习笔记(四)--http协议与服务器 Nodejs学习笔记(五)--express ...

  9. JavaScript:回调函数(callback)

    前言 callback,大家都知道是回调函数的意思.如果让你举些callback的例子,我相信你可以举出一堆.但callback的概念你知道吗?你自己在实际应用中能不能合理利用回调实现功能? 我们在平 ...

最新文章

  1. 话AI、学实践、探未来,亚马逊云科技AI在线大会报名开启!
  2. minicom指令_【教程】minicom使用教程
  3. C语言数组作为传入参数
  4. 登录:应用程序错误通知
  5. php7 验证url格式,url的组成格式为
  6. ARToolKit从图片生成特征点数据
  7. Redis学习总结(9)——Redis常见面试题汇总
  8. (林雷看来13):功能优先,发展和重建同步,业绩后
  9. c语言有趣的编程代码,一个有趣的小程序
  10. 谷歌 Daydream VR 开发工具
  11. 少儿编程、软硬编程课件、创意Scratch的项目小游戏,可单独上一节课
  12. MATLAB 【学习视频推荐】——新手必备
  13. 河北省农村居民家庭平均每百户家用计算机拥有量,2013-2015年全国居民家庭平均每百户计算机拥有量统计...
  14. 【Choco Disco】MMD镜头+动作打包下载.zip
  15. Windows 桌面主题 1.2
  16. 前端js——金山打字通小游戏(屏幕随机下落字母,获取键盘按键)
  17. verilog对信号二分频 时钟分频信号作为时钟使能信号
  18. 助力全球抗疫,腾讯加入Linux基金会公共卫生计划
  19. 学习用 JS/CSS 画一个时钟
  20. SIP协议详解(中文)-1

热门文章

  1. 《左耳听风》完结感受
  2. scrapy框架(二)
  3. 今年冬天有点冷(2)
  4. Hadoop 入门指南
  5. 正弦信号与复指数信号
  6. python输入三个整数x、y、z、请把这三个数由小到大输出_输入三个整数x、y、z,请把这三个数由小到大输出...
  7. 【首发】系统级彻底屏蔽macOS系统软件更新,删除小红点治愈强迫症
  8. 邮箱的格式有哪些,外国人个人、公司都用邮件沟通吗?
  9. 【物联网竞赛-ZigBee无线点对点控制灯光】
  10. linux离线安装tcpdump