初识NodeJS,印象最深的莫过于他的事件机制,和回调函数,他的读取文件的代码段如下:
var fs = require('fs'); fs.readFile('file.txt', 'utf-8', function(err, data) { if(err) console.error(...); else console.log(...); }); console.log(...);
这边好玩的是,他的代码并不是顺序执行的,代码中的function,并不是在readFile之后立刻执行,而是会先执行console.log(…)等到文件准备好之后,系统会触发一个文件准备好的事件,然后自动调用注册的回调函数进行执行.这一点很不同于Java中经典的BIO,代码会阻塞在Read上.
单线程事件驱动异步模型
这不得不说下NodeJS的单线程事件驱动的编程方式了.在旧版的NodeJS中并没有多线程的概念,一个程序都基于一个线程.从而减少多线程上下文切换带来的开销.但这会带来一个好玩的问题,比如,会写出反人类的,不可维护的代码.如一个简单的在数据库中删除数据,插入数据查询数据,更新数据这样一个串行的操作,会带来这样一段蛋疼的代码:
var mysql = require('mysql'); var conn = mysql.createConnection({ host: 'localhost', user: 'nodejs', password: 'nodejs', database: 'nodejs', port: 3306 }); conn.connect(); var insertSQL = 'insert into t_user(name) values("conan"),("fens.me")'; var selectSQL = 'select * from t_user limit 10'; var deleteSQL = 'delete from t_user'; var updateSQL = 'update t_user set name="conan update" where name="conan"'; //delete conn.query(deleteSQL, function (err0, res0) { if (err0) console.log(err0); console.log("DELETE Return ==> "); console.log(res0); //insert conn.query(insertSQL, function (err1, res1) { if (err1) console.log(err1); console.log("INSERT Return ==> "); console.log(res1); //query conn.query(selectSQL, function (err2, rows) { if (err2) console.log(err2); console.log("SELECT ==> "); for (var i in rows) { console.log(rows[i]); } //update conn.query(updateSQL, function (err3, res3) { if (err3) console.log(err3); console.log("UPDATE Return ==> "); console.log(res3); //query conn.query(selectSQL, function (err4, rows2) { if (err4) console.log(err4); console.log("SELECT ==> "); for (var i in rows2) { console.log(rows2[i]); } }); }); }); }); });
这不得不说是一个反社会的代码,虽然现在有改善这一情况的开源库,但还是麻烦,所以NodeJS在我眼里,最应该出现的地方因该是要求高并发,低复杂度业务逻辑的案例,比如说消息服务器.
但是,对于这么一个好玩的模型,我决定用Java实现,换一种思路写代码.
看来完全的异步也是很恐怖的。
不过密集的回调函数又让我感受到了代码的魅力
@ming:对的,不同的编程思想和方式确实充满了魅力。