轻松创建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与Mysql的交互示例代码
Aug 18 NodeJs
用nodejs实现PHP的print_r函数代码
Mar 14 NodeJs
NodeJs中的VM模块详解
May 06 NodeJs
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
Jan 12 NodeJs
详解nodejs中exports和module.exports的区别
Feb 17 NodeJs
async/await与promise(nodejs中的异步操作问题)
Mar 03 NodeJs
实例分析nodejs模块xml2js解析xml过程中遇到的坑
Mar 18 NodeJs
NodeJS测试框架mocha入门教程
Mar 28 NodeJs
nodejs开发微信小程序实现密码加密
Jul 11 NodeJs
nodejs实现日志读取、日志查找及日志刷新的方法分析
May 20 NodeJs
nodejs简单抓包工具使用详解
Aug 23 NodeJs
NodeJs内存占用过高的排查实战记录
May 10 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模板类代码
2008/09/07 PHP
php MYSQL 数据备份类
2009/06/19 PHP
php专用数组排序类ArraySortUtil用法实例
2015/04/03 PHP
Zend Framework教程之Zend_Db_Table用法详解
2016/03/21 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
PHP实现微信提现(企业付款到零钱)
2019/08/01 PHP
经典的解除许多网站无法复制文字的绝招
2006/12/31 Javascript
[转]JS宝典学习笔记
2007/02/07 Javascript
根据出生日期自动取得星座的js代码
2010/07/20 Javascript
一款jquery特效编写的大度宽屏焦点图切换特效的实例代码
2013/08/05 Javascript
获取当前月(季度/年)的最后一天(set相关操作及应用)
2016/12/27 Javascript
vue 中使用 watch 出现了如下的报错的原因分析
2019/05/21 Javascript
js实现一个简易计算器
2020/03/30 Javascript
[03:02]生活中的Dendi之野外度假篇
2016/08/09 DOTA
利用Psyco提升Python运行速度
2014/12/24 Python
Python 搭建Web站点之Web服务器与Web框架
2016/11/06 Python
完美解决Python2操作中文名文件乱码的问题
2017/01/04 Python
解决phantomjs截图失败,phantom.exit位置的问题
2018/05/17 Python
PyCharm中代码字体大小调整方法
2019/07/29 Python
Python定时发送天气预报邮件代码实例
2019/09/09 Python
python 实现全球IP归属地查询工具
2020/12/18 Python
Python实现简单的2048小游戏
2021/03/01 Python
Spartoo比利时:欧洲时尚购物网站
2017/12/06 全球购物
海量信息软件测试笔试题
2015/08/08 面试题
涉外文秘个人求职的自我评价
2013/10/07 职场文书
好的自荐信包括什么内容
2013/11/07 职场文书
公司周年庆典邀请函
2014/01/12 职场文书
期中考试后的反思
2014/02/08 职场文书
函授本科个人自我鉴定
2014/03/25 职场文书
反邪教宣传工作方案
2014/05/07 职场文书
慈善捐赠倡议书
2014/08/30 职场文书
基层干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
银行竞聘报告范文
2014/11/06 职场文书
教您怎么制定西餐厅运营方案 ?
2019/07/05 职场文书
详细聊一聊mysql的树形结构存储以及查询
2022/04/05 MySQL