轻松创建nodejs服务器(8):非阻塞是如何实现的


Posted in NodeJs onDecember 18, 2014

这节我们来了解一下nodejs实现非阻塞操作的方法。

我们先来修改一下 start的处理程序:

var exec = require("child_process").exec;

function start() {

  console.log("Request handler 'start' was called.");

  var content = "empty";

  exec("ls -lah", function (error, stdout, stderr) {

 content = stdout;

  });

  return content;

}

 

function upload() {

  console.log("Request handler 'upload' was called.");

  return "Hello Upload";

}

 

exports.start = start;

exports.upload = upload;

这段代码,创建了一个新的变量content(初始值为“empty”),执行“ls -lah”命令,将结果赋值给content,最后将content返回。

我们引入了一个新的Node.js模块,child_process,之所以用它,是为了实现一个既简单又实用的非阻塞操作:exec()。

那么exec()做了什么呢?

它从Node.js来执行一个shell命令。在上面的例子里,我们用它来获取当前目录下所有的文件(“ls -lah”),然后,当/startURL请求的时候将文件信息输出到浏览器中。

我们启动服务器,访问“http://localhost:8888/start”我们会发现页面输出的内容是 empty。

exec()发挥作用了,有了它,我们可以执行非常耗时的shell操作而无需迫使我们的应用停下来等待该操作。

虽然如此,但是页面输出的内容似乎不是我们想要的结果。

我们来分析一下原因:

我们的代码是同步执行的,这就意味着在调用exec()之后,Node.js会立即执行 return content ;

在这个时候,content仍然是“empty”,因为传递给exec()的回调函数还未执行到——因为exec()的操作是异步的。

下一节我们将介绍如何解决这个问题。

NodeJs 相关文章推荐
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
Sep 26 NodeJs
NodeJS使用jQuery选择器操作DOM
Feb 13 NodeJs
NodeJs中的VM模块详解
May 06 NodeJs
Nodejs实战心得之eventproxy模块控制并发
Oct 27 NodeJs
NodeJS创建最简单的HTTP服务器
May 15 NodeJs
NodeJS链接MySql数据库的操作方法
Jun 27 NodeJs
nodejs前端自动化构建环境的搭建
Jul 26 NodeJs
nodejs 最新版安装npm 的使用详解
Jan 18 NodeJs
NodeJS实现不可逆加密与密码密文保存的方法
Mar 16 NodeJs
nodejs连接mysql数据库及基本知识点详解
Mar 20 NodeJs
nodejs 日志模块winston的使用方法
May 02 NodeJs
Nodejs 和 Electron ubuntu下快速安装过程
May 04 NodeJs
轻松创建nodejs服务器(9):实现非阻塞操作
Dec 18 #NodeJs
轻松创建nodejs服务器(6):作出响应
Dec 18 #NodeJs
轻松创建nodejs服务器(5):事件处理程序
Dec 18 #NodeJs
轻松创建nodejs服务器(4):路由
Dec 18 #NodeJs
轻松创建nodejs服务器(3):代码模块化
Dec 18 #NodeJs
轻松创建nodejs服务器(2):nodejs服务器的构成分析
Dec 18 #NodeJs
轻松创建nodejs服务器(1):一个简单nodejs服务器例子
Dec 18 #NodeJs
You might like
php select,radio和checkbox默认选择的实现方法
2010/05/15 PHP
PHP字符串处理的10个简单方法
2010/06/30 PHP
php excel类 phpExcel使用方法介绍
2010/08/21 PHP
thinkphp文件引用与分支结构用法实例
2014/11/26 PHP
Ext grid 添加右击菜单
2009/11/26 Javascript
为jquery的ajaxfileupload增加附加参数的方法
2014/03/04 Javascript
javascript获取浏览器类型和版本的方法(js获取浏览器版本)
2014/03/13 Javascript
JS+CSS实现闪烁字体效果代码
2016/04/05 Javascript
Javascript实现跑马灯效果的简单实例
2016/05/31 Javascript
自制微信公众号一键排版工具
2016/09/22 Javascript
关于jquery form表单序列化的注意事项详解
2017/08/01 jQuery
JavaScript的数据类型转换原则(干货)
2018/03/15 Javascript
手把手教您实现react异步加载高阶组件
2020/04/07 Javascript
[00:27]DOTA2次级职业联赛 - Lilith战队宣传片
2014/12/01 DOTA
跟老齐学Python之坑爹的字符编码
2014/09/28 Python
python实现根据窗口标题调用窗口的方法
2015/03/13 Python
详细介绍Ruby中的正则表达式
2015/04/10 Python
Python获取CPU、内存使用率以及网络使用状态代码
2018/02/08 Python
解决Django加载静态资源失败的问题
2019/07/28 Python
python实现多进程通信实例分析
2019/09/01 Python
python如何把字符串类型list转换成list
2020/02/18 Python
使用python matplotlib 画图导入到word中如何保证分辨率
2020/04/16 Python
Python Switch Case三种实现方法代码实例
2020/06/18 Python
学python需要去培训机构吗
2020/07/01 Python
Python3.9新特性详解
2020/10/10 Python
美国大尺码女装零售商:TORRID
2016/10/01 全球购物
受欢迎的大学生自我评价
2013/12/05 职场文书
教师绩效工资方案
2014/02/01 职场文书
小学运动会入场式解说词
2014/02/18 职场文书
常务副总经理岗位职责
2014/04/12 职场文书
求职信如何撰写?
2019/05/22 职场文书
提升Nginx性能的一些建议
2021/03/31 Servers
MySQL 8.0 Online DDL快速加列的相关总结
2021/06/02 MySQL
手把手教你导入Go语言第三方库
2021/08/04 Golang
Python 数据可视化神器Pyecharts绘制图像练习
2022/02/28 Python
win10滚动条自动往上跑怎么办?win10滚动条自动往上跑的解决方法
2022/08/05 数码科技