Node.js中的回调函数详解

本文深入解析Node.js中的回调函数,阐述其定义、用途及异步编程中的关键作用。通过实例展示回调函数如何实现文件读取的异步执行,以及在数据库操作中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

回调函数概述

回调函数在很多地方都有用到,本文主要介绍Node.js的回调函数。主要是做这个人理解,如有错误,欢迎指正。

回调函数定义

回调函数就是一个通过函数指针调用的函数,当把该函数地址作为参数传递给另一个函数,当一个指针用来调用其所指向的函数时,就可被称为回调函数。

回调函数主要用途

在Node.js中,异步编程的实现主要就是依靠回调函数,回调函数在任务完成后被调用。可以做到在不阻塞或等待文件I/O操作的情况下,执行大量并发请求。

第一次学习回调函数是在Node.js对MySQL数据库进行读取后,发现数据库读取函数connection.query();是一个异步函数,在做登录功能时无法直接用获取到的数据进行密码比对,多方查找,开始使用回调函数把获取的数据返回出来。

回调函数用法

回调函数基本格式

function xxx(parameter1, parameter2, callback) { }

回调函数一般作为函数的左后一个参数出现,一个函数中可以出现多个回调函数,如:

function newxxx(parameter1, parameter2, callback1,callback2) { }

简单的回调函数实例(执行顺序理解)

首先创建1.txt文件
内容为:
我是文本文档1111

//代码1
var fs = require("fs");
var path="F://1.txt";
var data = fs.readFileSync(path);
console.log(data.toString());
console.log("over!");
//代码2
var fs = require("fs");
var path="F://1.txt";
fs.readFile(path, function (err, data) {
    if (err) return console.error(err);
    console.log(data.toString());
});
console.log("over!");

其中,代码1正常的同步执行,代码2使用了回调函数,使读取和后续代码并发执行。
结果如下:
代码2执行结果:
代码2执行结果
代码1执行结果:
代码1执行结果
可以看出,异步执行时,代码会继续执行下去,同步时需要等待文件读取完成才会继续执行。

回调函数实例

以下是自己在对数据库进行读取时使用的回调函数的方式。仅供参考:

var mysql  = require('mysql');  
 //调用mysql数据库连接包
var connection = mysql.createConnection({     
  host     : 'localhost',       
  user     : 'root',              
  password : '123456',       
  port: '3306',                   
  database: 'littlefarm' 
}); 
//数据库连接需要的信息
 
connection.connect();
 //数据库连接
var _getpassword = function(acnt, callback) {//调用callback回调函数
    var sql = 'SELECT password FROM user where user_name= ?';
	var x=[acnt];
    connection.query(sql,x, function(err, results) {
        if(!err) {
            var res = user(results)
            callback(res);//将所获取的数据返回出去

        }else {
            callback(error());
        }
    });

    function user(results) {
        if(results.length == 0) {
            return {err: 1, msg: "此用户名不存在"};
        }
        else {
            return results;
        }
    }

    function error() {
        return {err: 1, msg: "数据库出错"};
    }
}

var getpassword = function(acnt, callback){//匿名函数调用获取数据函数
    return _getpassword(acnt, callback);
}

// 处理/login的post请求
router.post('/login', function (req, res) {
    let acnt = req.body.acnt;
    let pswd = req.body.pswd;
    let code = getpassword(acnt,function(data){//实例化回调函数
    var password = data;
	console.log( password[0].password);
	  if(pswd == password[0].password){//密码正确
            res.writeHead(200, {"Access-Control-Allow-Origin": "http://localhost:63342"});
            res.write(String(1));
            res.end();
        }else{//密码错误
			res.writeHead(200, {"Access-Control-Allow-Origin": "http://localhost:63342"});
       			 res.write(String(0));}
				 res.end();
    
});
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值