轻松创建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文件操作模块FS(File System)常用函数简明总结
Jun 05 NodeJs
nodejs实现黑名单中间件设计
Jun 17 NodeJs
Nodejs中自定义事件实例
Jun 20 NodeJs
nodejs修复ipa处理过的png图片
Feb 17 NodeJs
nodejs的压缩文件模块archiver用法示例
Jan 18 NodeJs
NodeJS遍历文件生产文件列表功能示例
Jan 22 NodeJs
nodejs创建简易web服务器与文件读写的实例
Sep 07 NodeJs
详解nodeJs文件系统(fs)与流(stream)
Jan 24 NodeJs
nodejs简单访问及操作mysql数据库的方法示例
Mar 15 NodeJs
nodejs搭建本地服务器并访问文件操作示例
May 11 NodeJs
nodejs二进制与Buffer的介绍与使用
Jul 11 NodeJs
nodejs的安装使用与npm的介绍
Sep 11 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
zf框架的校验器使用使用示例(自定义校验器和校验器链)
2014/03/13 PHP
php模拟服务器实现autoindex效果的方法
2015/03/10 PHP
Symfony2 session用法实例分析
2016/02/04 PHP
PHP模糊查询技术实例分析【附源码下载】
2019/03/07 PHP
Laravel统计一段时间间隔的数据方法
2019/10/09 PHP
JS获取dom 对象 ajax操作 读写cookie函数
2009/11/18 Javascript
jQuery-ui引入后Vs2008的无智能提示问题解决方法
2014/02/10 Javascript
浏览器窗口加载和大小改变事件示例
2014/02/27 Javascript
js在指定位置增加节点函数insertBefore()用法实例
2015/01/12 Javascript
jquery中live()方法和bind()方法区别分析
2016/06/23 Javascript
Javascript 正则表达式校验数字的简单实例
2016/11/02 Javascript
详解jQuery选择器
2016/12/21 Javascript
浅谈Vue-cli单文件组件引入less,sass,css样式的不同方法
2018/03/13 Javascript
AngularJS与BootStrap模仿百度分页的示例代码
2018/05/23 Javascript
JS实现简易留言板特效
2019/12/23 Javascript
Vue+Vant 图片上传加显示的案例
2020/11/03 Javascript
[03:57]2016完美“圣”典风云人物:rOtk专访
2016/12/09 DOTA
django实现分页的方法
2015/05/26 Python
python实现学生信息管理系统
2020/04/05 Python
PyQt5每天必学之日历控件QCalendarWidget
2018/04/19 Python
用Python解决x的n次方问题
2019/02/08 Python
Python切片操作去除字符串首尾的空格
2019/04/22 Python
Python分析彩票记录并预测中奖号码过程详解
2019/07/09 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
2019/08/23 Python
python set集合使用方法解析
2019/11/05 Python
python3 pathlib库Path类方法总结
2019/12/26 Python
Django 自定义权限管理系统详解(通过中间件认证)
2020/03/11 Python
Python实现删除某列中含有空值的行的示例代码
2020/07/20 Python
python中把元组转换为namedtuple方法
2020/12/09 Python
浅谈基于Canvas的手绘风格图形库Rough.js
2018/03/19 HTML / CSS
材料采购员岗位职责
2013/12/17 职场文书
目标责任书格式
2014/07/28 职场文书
求职导师推荐信范文
2015/03/27 职场文书
《为人民服务》教学反思
2016/02/20 职场文书
python+opencv实现视频抽帧示例代码
2021/06/11 Python
教你怎么用Python selenium操作浏览器对象的基础API
2021/06/23 Python