轻松创建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中自定义事件实例
Jun 20 NodeJs
基于NodeJS的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
Sep 26 NodeJs
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
Nov 20 NodeJs
nodejs个人博客开发第二步 入口文件
Apr 12 NodeJs
NodeJS链接MySql数据库的操作方法
Jun 27 NodeJs
nodejs 搭建简易服务器的图文教程(推荐)
Jul 18 NodeJs
NodeJS简单实现WebSocket功能示例
Feb 10 NodeJs
nodejs微信开发之自动回复的实现
Mar 17 NodeJs
nodejs检测因特网是否断开的解决方案
Apr 17 NodeJs
nodejs环境使用Typeorm连接查询Oracle数据
Dec 05 NodeJs
使用nodejs实现JSON文件自动转Excel的工具(推荐)
Jun 24 NodeJs
浅谈使用nodejs搭建web服务器的过程
Jul 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版(3)
2006/10/09 PHP
在字符串中把网址改成超级链接
2006/10/09 PHP
PHP实现返回JSON和XML的类分享
2015/01/28 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
在JavaScript中获取请求的URL参数
2010/12/22 Javascript
jQuery之按钮组件的深入解析
2013/06/19 Javascript
jQuery实现图片放大预览实现原理及代码
2013/09/12 Javascript
jQuery ajax调用WCF服务实例
2014/07/16 Javascript
jquery+ajax验证不通过也提交表单问题处理
2014/12/12 Javascript
Bootstrap模态对话框的简单使用
2016/04/29 Javascript
jquery 无限极下拉菜单的简单实例(精简浓缩版)
2016/05/31 Javascript
HTML页面定时跳转方法解析(2种任选)
2016/12/22 Javascript
JS去除字符串中空格的方法
2017/02/14 Javascript
JavaScript函数表达式详解及实例
2017/05/05 Javascript
利用jQuery+localStorage实现一个简易的计时器示例代码
2017/12/25 jQuery
JS解析后台返回的JSON格式数据实例
2018/08/06 Javascript
学习node.js 断言的使用详解
2019/03/18 Javascript
jQuery实现input输入框获取焦点与失去焦点时提示的消失与显示功能示例
2019/05/27 jQuery
vuex分模块后,实现获取state的值
2020/07/26 Javascript
[00:12]2018DOTA2亚洲邀请赛 Sccc亮相SOLO赛,今年他又会有什么样的战绩?
2018/04/06 DOTA
python中os操作文件及文件路径实例汇总
2015/01/15 Python
以一段代码为实例快速入门Python2.7
2015/03/31 Python
Python的Django框架中forms表单类的使用方法详解
2016/06/21 Python
python写入并获取剪切板内容的实例
2018/05/31 Python
详解python读取和输出到txt
2019/03/29 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
2019/06/19 Python
Python 200行代码实现一个滑动验证码过程详解
2019/07/11 Python
Numpy中对向量、矩阵的使用详解
2019/10/29 Python
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
台湾旅游网站:雄狮旅游网
2017/08/16 全球购物
小学教师的自我评价范例
2013/10/31 职场文书
采购人员的个人自我评价
2014/01/16 职场文书
婚礼主持词
2014/03/13 职场文书
《圆的面积》教学反思
2016/02/19 职场文书
新店开业策划方案怎么书写?
2019/07/05 职场文书
golang 实现时间戳和时间的转化
2021/05/07 Golang