彻底理解NodeJs中的回调(Callback)函数

简介: 究竟什么是回调函数(Callback),网上有许许多多的文章,大部分看得人云里雾外,这些文章大概分成两类,第一类堆砌了太多的术语,基本上不明白术语就没法看,另一类反过来,不讲术语,完全是举一些脱离编程的生活化例子来类比,看的人更加晕头转向。

究竟什么是回调函数(Callback),网上有许许多多的文章,大部分看得人云里雾外,这些文章大概分成两类,第一类堆砌了太多的术语,基本上不明白术语就没法看,另一类反过来,不讲术语,完全是举一些脱离编程的生活化例子来类比,看的人更加晕头转向。

作为JS的核心,回调函数和异步执行是紧密相关的,不跨过这个门槛,很多回调代码能把人看晕!

引用stack overflow 上大神的描述 其实callback 很简单也很纯粹:
A "callback" is any function that is called by another function which takes the first function as a parameter. (在一个函数中调用另外一个函数就是callback)

以下是一个最简单的例子:

function a() {

return 1

}

function b(aa) {

return 2 + aa

}

//调用:

var c=0
c = b(a()) //A是个函数,但它又作为一个参数在B函数中被调用
console.log(c) //结果显示3

以上例子极易理解,下面再引入另一个概念:异步

看以下代码:

var a = 0

function bb(x) {

console.log(x)

}

function timer(time) {

setTimeout(function () {
    a=6
}, time);

}

//调用:

console.log(a)
timer(3000)
bb(a)

以上代码很简单,
我们需要的逻辑是,全局变量a初值为0,然后过3秒后,让它为6,然后再打印出来,
看上去,上面的代码没有问题,理论上符合我们的逻辑需求,但却发现结果是这样:
0
0
咋回事?
因为JS是一种异步执行语言,尽管timer函数内让a=6了,但是JS不会死等时间结束再跳出函数,
而是马上就会执行下一步语句(即调用bb函数),但这时候3秒钟根本就没结束,a还没有被重新赋值,
所以打印出来还是为0。

用回调函数可以解决这个问题:

var a = 0

function bb(x) {

console.log(x)

}

function timer(time, callback) {

setTimeout(function () {
    a = 6
    callback(a);
}, time);

}

//调用:

console.log(a)
timer(3000,bb)

这次,在timer函数中添加了一个关键字callback,意思就是说此处不是一个普通的参数,而是一个函数名,
打起精神,关键的地方来了:

一般而言,函数的形参是指由外往内向函数体传递变量的入口,

但此处加了callback后则完全相反,

它是指函数体在完成某种使命后调用外部函数的出口!

这时候应该明白什么叫“回调”了吧,也就是回头调用外部函数的意思。

在本例中,当3秒钟到了后,首先a=6,然后通过关键字callback(a)调用了函数bb(x),结果显示:
0
6
这个逻辑,符合我们的需求。

在写法上,也可以不需要定义函数bb, 直接在调用timer的时候写成function形式,
把调用部分改成这样也可以,效果完全一样:

console.log(a)
timer(3000, function (x) {
    console.log(x)
})

这种写法函数名都不需要了(术语称为“匿名函数”),在nodejs代码中更为常见也更好理解,翻译成自然语言就是:定时3秒,完成后再回头调用function(x)里面的内容。

nodejs编程中大量使用了异步编程技术,这是为了高效使用硬件,同时也可以不造成同步阻塞。其实nodejs在底层还是通过多线程技术实现的异步操作,但普通用户并不需要深究它的实现方法,我们只要做好我们的异步处理即可。

作者:rockage
来源:CSDN
原文:https://blog.csdn.net/rockage/article/details/79513450
版权声明:本文为博主原创文章,转载请附上博文链接!

相关文章
|
2月前
|
数据采集 JavaScript 前端开发
NodeJS技巧:在循环中管理异步函数的执行次数
在Node.js网络爬虫开发中,管理异步函数执行次数是关键。利用Promise.all、async/await或async库能优雅地控制并发。示例展示如何用async/await配合代理IP抓取数据,避免触发反爬策略。在循环中,每个异步请求只执行一次,保证请求有序进行,提高爬虫的稳定性和效率。通过正确的方法,可以有效应对网络爬虫的挑战。
NodeJS技巧:在循环中管理异步函数的执行次数
|
2月前
|
运维 监控 JavaScript
函数计算产品使用问题之将自定义层(nodejs 20)添加到了函数中,本地运行没有问题,但在函数计算中出现问题,该怎么办
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
3月前
|
JavaScript 前端开发
Node.js 函数
Node.js 函数
25 4
|
4月前
|
JavaScript 前端开发 数据库
【Node系列】node中的函数
在Node.js中,函数是一段可重复使用的代码,它可以接受输入(参数),执行一系列操作,并返回一个结果(返回值)。
29 3
|
4月前
|
存储 JavaScript 前端开发
Node.js 函数是什么样的?
Node.js 函数是什么样的?
55 0
|
JavaScript 前端开发
node.js入门学习(1): 让phpstorm配置支持ES语法,箭头函数正常代码格式化
node.js入门学习(1): 让phpstorm配置支持ES语法,箭头函数正常代码格式化
109 0
|
Web App开发 JavaScript
【Node.js】全局可用变量、函数和对象
在Node.js中提供了一些全局可用的变量、函数和对象,全局就是不需要进行模块加载,可以直接使用的。其中包括全局作用域的函数和对象。也包括不在全局作用域,而在每个模块作用域都存在的变量、函数和对象,在全局可用,但不是golbal对象的属性。
|
JavaScript
node.js:setTimeout实现同步delay延时函数
node.js:setTimeout实现同步delay延时函数
153 0
node40-异步函数在node得应用
node40-异步函数在node得应用
85 0
node40-异步函数在node得应用
|
JavaScript 前端开发
Nodejs函数
nodejs零碎知识记录
72 0