NodeJS 以事件响应的形式返回结果大家都知道的,所以有时候不能直接返回值给函数调用,那就需要在事件响应后把结果返回,于是就用到了匿名函数作为函数参数 (也可以理解为返回值作为另一个函数的参数)。
代码,以前一般做法:
function a()
{
var result = b();
document.write(result);
}
function b()
{
var a=123; return a;
}
但是如果本身 function b() 里面就嵌套一个事件响应,想把响应的结果返回就不行了。如代码:
connection.query("select * from table1",function selectCb(err, results, fields)
{
if (err)
{
console.log("=== query err: sql=["+sql+"], "+err+"===");
fun(-1);
}
return results;//这样在调用函数里面是不会收到返回值的
});
原因:因为Nodejs 非阻塞的问题,以上函数调用后就已经马上返回了,根本等不到数据查询出来。
相当于调用以下函数aa(),你是不会等得到返回result的,因为调用aa(),执行query()后,接着执行下面的代码,也就是函数已经返回,但其他数据库可能还没有查询出来结果。
function aa()
{
connection.query()
{
var result;
....;//数据库查询
return result;
}
return null;
}
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<script>
function test( a, b ){
a+=1;
b(a);
}
test(3, function(result){
console.log(result);
});
</script>
</body>
</html>
一个使用例子:Node JS查询数据线信息
//Nodejs mysql交互的类定义
function dbHelper(username,password,database,hostname)
{
this.username = username;
this.password = password;
this.database = database;
this.hostname = hostname;
this.connection = require('mysql').createConnection({
host:this.hostname,
user:this.username,
password:this.password,
database: this.database
});
this.query = function(sql,fun)
{
this.connection.query(sql,function selectCb(err, results, fields)
{
if (err)
{
console.log("=== query err: sql=["+sql+"], "+err+"===");
fun(-1);
}
fun(results);
});
}
}
var db = new dbHelper('root','123456','nodejs_mysql_test',"localhost");
db.query('SELECT * FROM test',function(result){
console.log("out putting result...");
//console.log(result);
for(var i=0;i<result.length;i++)
{
console.log(result[i].id);
console.log(result[i].title);
console.log(result[i].text);
}
});
PS,以上dbHelper 的写法,一般在Node js要用module.exports = dbHelper;