科普文一则,说说我对Node.js的一些认识,以及我作为前端工程师为什么会向后端工程师推荐Node.js。
“Node.js 是服务器端的 JavaScript 运行环境,它具有无阻塞(non-blocking)和事件驱动(event-driven)等的特色,Node.js 采用V8引擎,同样,Node.js实现了类似 Apache 和 nginx 的web服务,让你可以通过它来搭建基于 JavaScript的Web App。”
我想不仅仅是Node.js,当我们要引入任何一种新技术前都必须要搞清楚几个问题:
1. 我们遇到了什么问题?
2. 这项新技术解决什么问题,是否契合我们遇到的问题?
3. 我们遇到问题的多种解决方案中,当前这项新技术的优势体现在哪儿?
4. 使用新技术,带来哪些新问题,严重么,我们能否解决掉?
我们的问题:Server端阻塞
Node.js被设计用来解决服务端阻塞问题.下面通过一段简单的代码解释何为阻塞:
1 2 3 4 |
//根据ID,在数据库中Persons表中查出Name var name = db.query("select name from persons where id=1"); //进程等待数据查询完毕,然后使用查询结果。 output("name") |
1 2 3 4 5 6 |
//定义如何后续数据处理函数 function onDataLoad(name){ output("name"); } //发起数据请求,同时指定数据返回后的回调函数 db.query("select name from persons where id=1",onDataLoad); |
1 2 3 |
db.query("select name from persons where id=1",function(name){ output(name); }); |
1 2 3 4 5 6 7 |
//传统同步写法:将查询和结果打印抽象为一个方法 function main(){ var id = "1"; var name = db.query("select name from persons where id=" + id); output("person id:" + id + ", name:" + name); } main(); |
1 2 3 4 5 6 7 8 |
//异步写法: function main(){ var id = "1"; db.query("select name from persons where id=" + id,function(name){ output("person id:" + id + ", name:" + name);//n秒后数据返回后执行回调 }); } main(); |
1 2 3 4 5 6 7 8 9 |
function main(){ var id = "1"; var currentState = new Object(); currentState.person_id = id; db.query("select name from persons where id=" + id, function(name,state){ output("person id:" + state.person_id + ", name:" + name); },currentState);//注意currentState是db.query的第三个参数 } main(); |
1 2 3 4 5 6 7 8 9 10 |
function main(){ var id = "1"; var currentState = new Object(); currentState.person_id = id; function onDataLoad(name){ output("person id:" + onDataLoad.state.person_id + ", name:" + name); } onDataLoad.state = currentState ;//为函数指定state属性,用于保持状态 db.query("select name from persons where id=" + id, onDataLoad); } |