原文链接 http://taobaofed.org/blog/2015/10/29/deep-into-node-1/
前言
从 Node.js 进入人们的视野时, 我们所知道的它就由这些关键字组成 事件驱动, 非阻塞 I/O, 高效, 轻量, 它在官网中也是这么描述自己的.
Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient.
于是, 会有下面的场景出现:
当我们刚开始接触它时, 可能会好奇:
为什么在浏览器中运行的 Javascript 能与操作系统进行如此底层的交互?
当我们在用它进行文件 I/O 和网络 I/O 的时候, 发现方法都需要传入回调, 是异步的:
那么这种异步, 非阻塞的 I/O 是如何实现的?
当我们习惯了用回调来处理 I/O, 发现当需要顺序处理时, Callback Hell 出现了, 于是有想到了同步的方法:
那么在异步为主的 Node.js, 有同步的方法嘛?
身为一个前端, 你在使用时, 发现它的异步处理是基于事件的, 跟前端很相似:
那么它如何实现的这种事件驱动的处理方式呢?
当我们慢慢写的多了, 处理了大量 I/O 请求的时候, 你会想:
Node.js 异步非阻塞的 I/O 就不会有瓶颈出现吗?
之后你还会想:
Node.js 这么厉害, 难道没有它不适合的事情吗?
等等...
看到这些问题, 是否有点头大, 别急, 带着这些问题我们来慢慢看这篇文章.
- var fs = require('fs');
- fs.open('./test.txt', "w", function(err, fd) {
- //..do something
- });
- typedef struct uv_loop_s uv_loop_t;
- typedef struct uv_err_s uv_err_t;
- typedef struct uv_async_s uv_async_t;
- typedef struct uv_process_s uv_process_t;
- db.query('select nickname from users where id="12"', function() {
- db.query('select * from xxx where id="12"', function() {
- db.query('select * from xxx where id="12"', function() {
- db.query('select * from xxx where id="12"', function() {
- //...
- });
- });
- });
- });
- var data;
- try {
- data = fs.readFileSync('/test.txt');
- } catch (e) {
- if (e.code == 'ENOENT') {
- //...
- }
- //...
- }
来源: https://www.html-js.cn/details/EJnCs_AGe.html