轻松创建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整合银联网关支付(DEMO)
Nov 09 NodeJs
详解nodejs 文本操作模块-fs模块(三)
Dec 22 NodeJs
详谈Angular路由与Nodejs路由的区别
Mar 05 NodeJs
详解nodejs微信公众号开发——5.素材管理接口
Apr 11 NodeJs
nodejs实现OAuth2.0授权服务认证
Dec 27 NodeJs
Nodejs下使用gm圆形裁剪并合成图片的示例
Feb 22 NodeJs
nodejs实现范围请求的实现代码
Oct 12 NodeJs
Nodejs让异步变成同步的方法
Mar 02 NodeJs
使用nodejs分离html文件里的js和css详解
Apr 12 NodeJs
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
Apr 29 NodeJs
Nodejs封装类似express框架的路由实例详解
Jan 05 NodeJs
Sublime Text3 配置 NodeJs 环境的方法
May 20 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文件怎么打开 如何执行php文件
2011/12/21 PHP
shopex主机报错误请求解决方案(No such file or directory)
2011/12/27 PHP
PHP怎么实现网站保存快捷方式方便用户随时浏览
2013/08/15 PHP
PHP实现格式化文件数据大小显示的方法
2015/01/03 PHP
固定背景实现的背景滚动特效示例分享
2013/05/19 Javascript
用javascript删除当前行,添加行(示例代码)
2013/11/25 Javascript
js 验证身份证信息有效性
2014/03/28 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
2014/12/22 Javascript
JavaScript中的this关键字使用方法总结
2015/03/13 Javascript
canvas绘制七巧板
2017/02/03 Javascript
jquery实现轮播图效果
2017/02/13 Javascript
微信小程序实现动态设置页面标题的方法【附源码下载】
2017/11/29 Javascript
JS实现移动端触屏拖拽功能
2018/07/31 Javascript
element-ui upload组件多文件上传的示例代码
2018/10/17 Javascript
JavaScript 对引擎、运行时、调用堆栈的概述理解
2018/10/22 Javascript
VUE实现Studio管理后台之鼠标拖放改变窗口大小
2020/03/04 Javascript
通过js随机函数Math.random实现乱序
2020/05/19 Javascript
python提示No module named images的解决方法
2014/09/29 Python
python数据结构之列表和元组的详解
2017/09/23 Python
详解用Python处理HTML转义字符的5种方式
2017/12/27 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
2018/03/23 Python
python读取视频流提取视频帧的两种方法
2020/10/22 Python
python操作excel的方法(xlsxwriter包的使用)
2018/06/11 Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
2019/02/21 Python
pandas 选取行和列数据的方法详解
2019/08/08 Python
Python学习笔记之函数的参数和返回值的使用
2019/11/20 Python
Pycharm 2020.1 版配置优化的详细教程
2020/08/07 Python
YSL Beauty加拿大官方商城:圣罗兰美妆加拿大
2017/05/15 全球购物
营销与策划个人求职信
2013/09/22 职场文书
师范生求职自荐信
2014/06/14 职场文书
教师个人自我剖析材料
2014/09/29 职场文书
2014年幼儿园学期工作总结
2014/12/05 职场文书
幼儿园端午节活动总结
2015/05/05 职场文书
学困生转化工作总结
2015/08/13 职场文书
python Tkinter的简单入门教程
2021/04/11 Python
Python之Matplotlib绘制热力图和面积图
2022/04/13 Python