1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Node.js —— 回调函数callback

Node.js —— 回调函数callback

时间:2020-04-26 23:47:44

相关推荐

Node.js —— 回调函数callback

一、什么是回调函数

1、回调函数是作为参数传递给另一个函数

2、回调函数是一段可执行的代码段,它作为一个参数传递给其他的代码,其作用是在需要的时候方便调用这段(回调函数)代码

3、 函数运行完成,再执行回调函数

1、回调函数

function add(num1, num2, callback){var sum = num1 + num2;callback(sum);}function print(num){console.log(num);}add(1, 2, print);//=>3

2、匿名回调函数

function add(num1, num2, callback){var sum = num1 + num2;callback(sum);}add(1, 2, function(sum){console.log(sum);//=>3});

二、回调函数的特点

1、不会立刻执行

回调函数作为参数传递给一个函数的时候,传递的只是函数的定义并不会立即执行。和普通的函数一样,回调函数在函调用函数数中也要通过()运算符调用才会执行。

2、是个闭包

回调函数是一个闭包,也就是说它能访问到其外层定义的变量。

3、执行前类型判断

在执行回调函数前最好确认其是一个函数。

function add(num1, num2, callback){var sum = num1 + num2;if(typeof callback === 'function'){callback(sum);}}

三、回调函数的传参

如果回调函数需要传参,如何做到,这里介绍两种解决方案。

1、将回调函数的参数作为与回调函数同等级的参数进行传递

function say(content){console.log(content);}// say()是回调函数,回调函数需要参数contentfunction test(callback,content){callback(content);}test(say,'hello nodejs');

2、回调函数的参数在调用回调函数内部创建

function say(content){console.log(content);}function test(callback){content='hello nodejs';callback(content);}test(say);

四、回调函数里为什么需要return?

一方面,return的可以中断后面的逻辑执行。另一方面,代码会更加清晰

这是else的情况:

function dosomething(param) {func1(param, function(err, data) {if (err)console.log(err)else {func2(param, function(err, data) {if (err)console.log(err)else {func3(param, function(err, data) {if (err)console.log(err)else {console.log(result)}}}}}}}

改造成return是这样:

function dosomething(param) {func1(param, function(err, data) {if (err)return console.log(err)func2(param, function(err, data) {if (err)return console.log(err)func3(param, function(err, data) {if (err)return console.log(err)console.log(result)}}}}

五、回调函数中this的使用

注意在回调函数调用时this的执行上下文并不是回调函数定义时的那个上下文,而是调用它的函数所在的上下文。

var obj = {sum: 0,add: function(num1, num2){this.sum = num1 + num2;}};function add(num1, num2, callback){callback(num1, num2);};add(1,2, obj.add);console.log(obj.sum);//=>0console.log(window.sum);//=>3

上述代码调用回调函数的时候是在全局环境下,因此this指向的是window,所以sum的值是赋值给windows的。

关于this执行上下文的问题可以通过apply方法解决

var obj = {sum: 0,add: function(num1, num2){this.sum = num1 + num2;}};function add(num1, num2, callbackObj, callback){callback.apply(callbackObj, [ num1, num2 ]);};add(1,2, obj, obj.add);console.log(obj.sum);//=>3console.log(window.sum);//=>undefined

六、应用示例

Example:

fs.readFileSync( )函数里面定义了回调函数,故可以一边读取文件,一边执行其他命令,在文件读取完成后,再将文件内容作为回调函数的参数传入回调函数并执行回调函数。

1、阻塞代码示例

特点:按顺序执行。在文件读取完后才执行完程序

创建一个文件 input.txt ,内容如下:

hello nodejs

创建 main.js 文件, 代码如下:

var fs = require("fs");var data = fs.readFileSync('input.txt');console.log(data.toString());console.log("程序执行结束!");

以上代码执行结果如下:

$ node main.jshello nodejs程序执行结束!

2、非阻塞代码示例

特点:非顺序执行。不需要等待文件读取完,这样就可以在读取文件时同时执行接下来的代码,大大提高了程序的性能。

创建一个文件 input.txt ,内容如下:

hello nodejs

创建 main.js 文件, 代码如下:

var fs = require("fs");fs.readFile('input.txt', function (err, data) {if (err) return console.error(err);console.log(data.toString());});console.log("程序执行结束!");

以上代码执行结果如下:

$ node main.js程序执行结束!hello nodejs

参考链接

/topic/564dd2881ba2ef107f854e0b

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。