轻松创建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的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
Sep 26 NodeJs
Nodejs学习笔记之NET模块
Jan 13 NodeJs
nodejs实现HTTPS发起POST请求
Apr 23 NodeJs
nodejs简单实现中英文翻译
May 04 NodeJs
详解nodejs爬虫程序解决gbk等中文编码问题
Apr 06 NodeJs
NodeJs安装npm包一直失败的解决方法
Apr 28 NodeJs
Nodejs+angularjs结合multiparty实现多图片上传的示例代码
Sep 29 NodeJs
nodeJS微信分享
Dec 20 NodeJs
nodejs超出最大的调用栈错误问题
Dec 27 NodeJs
nodejs+mongodb+vue前后台配置ueditor的示例代码
Jan 02 NodeJs
nodejs结合socket.io实现websocket通信功能的方法
Jan 12 NodeJs
深入理解NodeJS 多进程和集群
Oct 17 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编程之高级技巧——利用Mysql函数
2006/10/09 PHP
获得Google PR值的PHP代码
2007/01/28 PHP
用PHP的超级变量$_POST获取HTML表单(HTML Form) 数据
2011/05/07 PHP
PHP MySQL应用中使用XOR运算加密算法分享
2011/08/28 PHP
解析crontab php自动运行的方法
2013/06/24 PHP
启用OPCache提高PHP程序性能的方法
2019/03/21 PHP
Laravel 5.2 文档 数据库 ―― 起步介绍
2019/10/21 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
javascript 模拟点击广告
2010/01/02 Javascript
Blocksit插件实现瀑布流数据无限( 异步)加载
2014/06/20 Javascript
node.js中的fs.appendFileSync方法使用说明
2014/12/17 Javascript
JS+DIV+CSS实现仿表单下拉列表效果
2015/08/18 Javascript
原生javascript实现图片放大镜效果
2017/01/18 Javascript
解决OneThink中无法异步提交kindeditor文本框中修改后的内容方法
2017/05/05 Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
2018/03/22 Javascript
js正则相关知识点专题
2018/05/10 Javascript
vue-cli3 项目从搭建优化到docker部署的方法
2019/01/28 Javascript
vue+springboot图片上传和显示的示例代码
2020/02/14 Javascript
[02:01]2018完美盛典-开场舞《双子星》
2018/12/16 DOTA
Django集成百度富文本编辑器uEditor攻略
2014/07/04 Python
Python中字典的浅拷贝与深拷贝用法实例分析
2018/01/02 Python
Python使用Selenium模拟浏览器自动操作功能
2020/09/08 Python
Python全局变量与global关键字常见错误解决方案
2020/10/05 Python
瑞典灯具和照明网上商店:Lamp24.se
2018/03/17 全球购物
strstr()的简单实现
2013/09/26 面试题
城市规划毕业生求职信
2013/10/10 职场文书
运动会解说词50字
2014/01/18 职场文书
置业顾问岗位职责
2014/03/02 职场文书
工程造价专业求职信
2014/07/17 职场文书
党的群众路线教育实践活动查摆剖析材料
2014/10/10 职场文书
个人典型事迹材料
2014/12/30 职场文书
个性与发展自我评价
2015/03/06 职场文书
创业计划书介绍
2019/04/24 职场文书
Pytorch中TensorBoard及torchsummary的使用详解
2021/05/12 Python
Python中Matplotlib的点、线形状、颜色以及绘制散点图
2022/04/07 Python
GPU服务器的多用户配置方法
2022/07/07 Servers