轻松创建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 npm package.json中文文档
Sep 04 NodeJs
轻松创建nodejs服务器(5):事件处理程序
Dec 18 NodeJs
nodejs中实现阻塞实例
Mar 24 NodeJs
使用DNode实现php和nodejs之间通信的简单实例
Jul 06 NodeJs
NodeJs的优势和适合开发的程序
Aug 14 NodeJs
nodejs个人博客开发第五步 分配数据
Apr 12 NodeJs
nodeJS实现简单网页爬虫功能的实例(分享)
Jun 08 NodeJs
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
Sep 18 NodeJs
nodejs用gulp管理前端文件方法
Jun 24 NodeJs
webpack打包nodejs项目的方法
Sep 26 NodeJs
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
Apr 29 NodeJs
nodejs dgram模块广播+组播的实现示例
Nov 04 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
mysql 全文搜索 技巧
2007/04/27 PHP
php基于str_pad实现卡号不足位数自动补0的方法
2014/11/12 PHP
CI框架整合smarty步骤详解
2016/05/19 PHP
PHP中empty,isset,is_null用法和区别
2017/02/19 PHP
php实现用户注册密码的crypt加密
2017/06/08 PHP
PDO::commit讲解
2019/01/27 PHP
Aster vs Newbee BO3 第三场2.18
2021/03/10 DOTA
js中cookie的使用详细分析
2008/05/28 Javascript
25个优雅的jQuery Tooltip插件推荐
2011/05/25 Javascript
利用Keydown事件阻止用户输入实现代码
2014/03/11 Javascript
JavaScript输出当前时间Unix时间戳的方法
2015/04/06 Javascript
JavaScript中数据结构与算法(二):队列
2015/06/19 Javascript
jquery中键盘事件小结
2016/02/24 Javascript
jQuery判断自定义属性data-val用法示例
2019/01/07 jQuery
微信小程序自定义导航栏(模板化)
2019/11/15 Javascript
JavaScript前端实现压缩图片功能
2020/03/06 Javascript
Vue 3.0 全家桶抢先体验
2020/04/28 Javascript
编程语言Python的发展史
2014/09/26 Python
Python实现把回车符\r\n转换成\n
2015/04/23 Python
Python基于Tkinter实现的记事本实例
2015/06/17 Python
Python实现配置文件备份的方法
2015/07/30 Python
初探利用Python进行图文识别(OCR)
2019/02/26 Python
在jupyter notebook 添加 conda 环境的操作详解
2020/04/10 Python
django创建css文件夹的具体方法
2020/07/31 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
2020/11/28 Python
Merchant 1948澳大利亚:新西兰领先的鞋类和靴子供应商
2018/03/24 全球购物
Lookfantastic日本官网:英国知名护肤、化妆品和头发护理购物网站
2018/04/21 全球购物
大学生职业生涯设计书
2014/01/02 职场文书
领导干部培训感言
2014/01/23 职场文书
参观接待方案
2014/03/17 职场文书
灰雀教学反思
2014/04/28 职场文书
就职演讲稿范文
2014/05/19 职场文书
高三语文复习计划
2015/01/19 职场文书
产品调价通知函
2015/04/20 职场文书
2015年高一班主任工作总结
2015/05/13 职场文书
索尼ICF-36收音机评测
2022/04/30 无线电