先说个小程序吧
function foo1(){ } function foo2( res ){ console.log(res) }这里如果函数foo2( )需要foo1( )的返回值或者foo1( )函数体内的一些参数,那怎么办呢?可以考虑回调,如下
db.js文件
var mysql = require('mysql') var db = { } //连接数据库 var pool = mysql.createConnection({ host:'127.0.0.1',//数据库地址 user:'root',//mysql认证用户名 password: '123456',//mysql认证用户密码 port:'3306', database:'testdb' }) pool.connect( function (err) { if(err){ console.log(err) return }else{ console.log('数据库已连接') } } ) //pool.query("CREATE TABLE person(id int, user varchar(255))") //查询 db.query = function ( userName, callback ) {//这里的pool.query是异步操作 var res = false var checkSql = 'SELECT user from person where user = '+ userName var q = pool.query(checkSql,function (err, result) { console.log(q.sql) if(err){ console.log('select error: '+err.message) return } //console.log('result: '+result) if( result!=0 ){ res = true } // console.log( "res: "+res ) callback( res ) }) } module.exports = dbserver.js文件
var http = require("http") var express = require('express') var app = express( ) var server = http.createServer(app) var io = require('socket.io').listen(server) var db = require("./db") app.use('/',express.static(__dirname+'/public')) server.listen(3000) io.on('connection', function (socket) { var usersLength = 0 socket.on('login', function (nickname) { // var userLength = db.getUserLength() db.query(nickname,function (existed) { console.log("内部existed: "+existed) if( existed ){//查询数据库昵称是否已经存在 socket.emit('nickExisted') console.log("existed: "+existed) }else{ // socket.userIndex = users.length socket.nickname = nickname // users.push(nickname) db.add(nickname) socket.emit('success') usersLength++ io.sockets.emit('system', nickname, usersLength, 'login') } }) }) })这个程序只是为了说明回调的作用,node.js我还在看。
db.js文件的pool.query(checkSql,function (err, result)
是异步执行的, 在server.js文件中 我们先要执行pool.query()函数利用 pool.query( )中的结果来判断,如果不利用回调server.js中的程序会先执行,之后 pool.query( )中的res结果才出现这样就出错了,因此采用了回调。