轻松创建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 实现模拟form表单上传文件
Jul 14 NodeJs
nodejs中的fiber(纤程)库详解
Mar 24 NodeJs
nodejs实现bigpipe异步加载页面方案
Jan 26 NodeJs
Nodejs如何搭建Web服务器
Mar 28 NodeJs
nodejs 的 session 简单使用
Jun 06 NodeJs
实例分析nodejs模块xml2js解析xml过程中遇到的坑
Mar 18 NodeJs
NodeJS实现自定义流的方法
Aug 01 NodeJs
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
Dec 06 NodeJs
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
Mar 02 NodeJs
Nodejs中使用puppeteer控制浏览器中视频播放功能
Aug 26 NodeJs
纯异步nodejs文件夹(目录)复制功能
Sep 03 NodeJs
浅谈Node的内存泄露问题
May 06 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伪造referer实例代码
2008/09/20 PHP
Smarty局部缓存的几种方法简介
2014/06/17 PHP
支付宝接口开发集成支付环境小结
2015/03/17 PHP
php文件扩展名判断及获取文件扩展名的N种方法
2015/09/12 PHP
在Mac OS下搭建LNMP开发环境的步骤详解
2017/03/10 PHP
如何用javascript去掉字符串里的所有空格
2007/02/08 Javascript
Js判断参数(String,Array,Object)是否为undefined或者值为空
2013/11/04 Javascript
禁用页面部分JavaScript不是全部而是部分
2014/09/03 Javascript
根据配置文件加载js依赖模块
2014/12/29 Javascript
NodeJS学习笔记之FS文件模块
2015/01/13 NodeJs
Eclipse配置Javascript开发环境图文教程
2015/01/29 Javascript
ajax读取数据后使用jqchart显示图表的方法
2015/06/10 Javascript
IE6兼容透明背景图片及解决方案
2015/08/19 Javascript
jQuery实现折叠、展开的菜单组效果代码
2015/09/16 Javascript
想学习javascript JS和jQuery哪个重要 先学哪个
2016/12/11 Javascript
js实现延迟加载的几种方法
2017/04/24 Javascript
echarts整合多个类似option的方法实例
2018/07/10 Javascript
JS判断字符串是否为整数的方法--简单的正则判断
2018/07/23 Javascript
详解如何在vue项目中使用eslint+prettier格式化代码
2018/11/10 Javascript
详解jQuery-each()方法
2019/03/13 jQuery
vue css 引入asstes中的图片无法显示的四种解决方法
2020/03/16 Javascript
ant design vue嵌套表格及表格内部编辑的用法说明
2020/10/28 Javascript
pygame播放音乐的方法
2015/05/19 Python
python读取图片并修改格式与大小的方法
2018/07/24 Python
PyTorch基本数据类型(一)
2019/05/22 Python
python绘制多个子图的实例
2019/07/07 Python
keras实现调用自己训练的模型,并去掉全连接层
2020/06/09 Python
python打包多类型文件的操作方法
2020/09/21 Python
自我评价中英文语句
2013/11/30 职场文书
安全生产工作汇报材料
2014/10/28 职场文书
黄石寨导游词
2015/02/05 职场文书
2015年六一儿童节活动总结
2015/02/11 职场文书
办公室主任个人总结
2015/02/28 职场文书
2015年幼儿园保育员工作总结
2015/04/23 职场文书
2016中秋节晚会开场白
2015/11/26 职场文书
SQL Server数据库备份和恢复数据库的全过程
2022/06/14 SQL Server