轻松创建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学习小结(一)
Jul 06 NodeJs
nodejs下打包模块archiver详解
Dec 03 NodeJs
NodeJS学习笔记之Connect中间件模块(一)
Jan 27 NodeJs
使用nodejs开发cli项目实例
Jun 03 NodeJs
Nodejs 搭建简单的Web服务器详解及实例
Nov 30 NodeJs
nodejs实现发出蜂鸣声音(系统报警声)的方法
Jan 18 NodeJs
解析NodeJS异步I/O的实现
Apr 13 NodeJs
使用nodejs+express实现简单的文件上传功能
Dec 27 NodeJs
详解redis在nodejs中的应用
May 02 NodeJs
NodeJS使用Range请求实现下载功能的方法示例
Oct 12 NodeJs
详解nodejs 开发企业微信第三方应用入门教程
Mar 12 NodeJs
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
Netflix将与CLAMP、乙一以及冲方丁等6名知名制作人合伙展开原创动画计划!
2020/03/06 日漫
台湾中原大学php教程孙仲岳主讲
2008/01/07 PHP
PHPLog php 程序调试追踪工具
2009/09/09 PHP
去除php注释和去除空格函数分享
2014/03/13 PHP
PHP中的Trait 特性及作用
2016/04/03 PHP
PHP通过CURL实现定时任务的图片抓取功能示例
2016/10/03 PHP
根据key删除数组中指定的元素实现方法
2017/03/02 PHP
Thinkphp 框架配置操作之动态配置、扩展配置及批量配置实例分析
2020/05/15 PHP
jQuery 通过事件委派一次绑定多种事件,以减少事件冗余
2010/06/30 Javascript
为jQuery增加join方法的实现代码
2010/11/28 Javascript
JS面向对象编程浅析
2011/08/28 Javascript
JS页面延迟执行一些方法(整理)
2013/11/11 Javascript
浅析JavaScript事件和方法
2015/02/28 Javascript
jQuery实现不断闪烁文字的方法
2015/05/15 Javascript
JavaScript实现点击文本自动定位到下拉框选中操作
2016/06/15 Javascript
利用jQuery的动画函数animate实现豌豆发射效果
2016/08/28 Javascript
JavaScript实现经典排序算法之插入排序
2016/12/28 Javascript
JavaScript自动点击链接 防止绕过浏览器访问的方法
2017/01/19 Javascript
js省市区级联查询(插件版&无插件版)
2017/03/21 Javascript
JavaScript设计模式之观察者模式实例详解
2019/01/16 Javascript
微信小程序button标签open-type属性原理解析
2020/01/21 Javascript
在vue中使用image-webpack-loader实例
2020/11/12 Javascript
javascript局部自定义鼠标右键菜单
2020/12/08 Javascript
[06:11]2014DOTA2国际邀请赛 专访团结一心的VG战队
2014/07/21 DOTA
使用Python的Tornado框架实现一个一对一聊天的程序
2015/04/25 Python
python模块简介之有序字典(OrderedDict)
2016/12/01 Python
python3.0 模拟用户登录,三次错误锁定的实例
2017/11/02 Python
matplotlib savefig 保存图片大小的实例
2018/05/24 Python
python 解决cv2绘制中文乱码问题
2019/12/23 Python
在tensorflow以及keras安装目录查询操作(windows下)
2020/06/19 Python
Larsson & Jennings官网:现代瑞士钟表匠
2018/03/20 全球购物
乡镇干部先进事迹材料
2014/02/03 职场文书
先进学校事迹材料
2014/12/30 职场文书
2015新学期校长寄语(3篇)
2015/03/25 职场文书
2016年员工年度考核评语
2015/12/02 职场文书
Python Django 后台管理之后台模型属性详解
2021/04/25 Python