轻松创建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 相关文章推荐
14款NodeJS Web框架推荐
Jul 11 NodeJs
轻松创建nodejs服务器(7):阻塞操作的实现
Dec 18 NodeJs
nodejs 整合kindEditor实现图片上传
Feb 03 NodeJs
nodeJS代码实现计算交社保是否合适
Mar 09 NodeJs
nodejs实现获取当前url地址及url各种参数值
Jun 25 NodeJs
Nodejs express框架一个工程中同时使用ejs模版和jade模版
Dec 28 NodeJs
Nodejs获取网络数据并生成Excel表格
Mar 31 NodeJs
详解NodeJS框架express的路径映射(路由)功能及控制
Mar 24 NodeJs
Nodejs进阶:express+session实现简易登录身份认证
Apr 24 NodeJs
nodejs基础之常用工具模块util用法分析
Dec 26 NodeJs
PHPStorm中如何对nodejs项目进行单元测试详解
Feb 28 NodeJs
nodejs如何在package.json中设置多条启动命令
Mar 16 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
星际争霸 Starcraft 发展史
2020/03/14 星际争霸
PHP入门学习笔记之一
2010/10/12 PHP
php缓存技术详细总结
2013/08/07 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
2015/03/03 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
2019/04/23 PHP
关于event.cancelBubble和event.stopPropagation()的区别介绍
2011/12/11 Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
2014/09/06 Javascript
jQuery实现的指纹扫描效果实例(附演示与demo源码下载)
2016/01/26 Javascript
js 实现数值的千分位及保存小数方法(推荐)
2016/08/01 Javascript
jquery实现静态搜索功能(可输入搜索文字)
2017/03/28 jQuery
详解vue服务端渲染(SSR)初探
2017/06/19 Javascript
JavaScript面向对象精要(下部)
2017/09/12 Javascript
浅谈Vue路由快照实现思路及其问题
2018/06/07 Javascript
详解滑动穿透(锁body)终极探索
2019/04/16 Javascript
vue+element UI实现树形表格带复选框的示例代码
2019/04/16 Javascript
JS禁用右键、禁用Ctrl+u、禁用Ctrl+s、禁用F12的实现代码
2020/12/01 Javascript
vue2和vue3的v-if与v-for优先级对比学习
2020/10/10 Javascript
Python深入学习之对象的属性
2014/08/31 Python
python实现将英文单词表示的数字转换成阿拉伯数字的方法
2015/07/02 Python
Python创建一个空的dataframe,并循环赋值的方法
2018/11/08 Python
Python基础知识点 初识Python.md
2019/05/14 Python
Python3 中作为一等对象的函数解析
2019/12/11 Python
Python 如何测试文件是否存在
2020/07/31 Python
现代生活方式的家具和装饰:Dot & Bo
2018/12/26 全球购物
采购部部长岗位职责
2014/02/06 职场文书
养生餐厅创业计划书范文
2014/03/26 职场文书
法人代表身份证明书及授权委托书
2014/09/16 职场文书
离婚协议书范文2014(夫妻感情破裂)
2014/12/14 职场文书
六年级语文下册教学计划
2015/01/22 职场文书
公司财务部岗位职责
2015/04/14 职场文书
2015年农村党员公开承诺事项
2015/04/28 职场文书
2015年财政局工作总结
2015/05/21 职场文书
企业催款函范本
2015/06/24 职场文书
如何制定销售人员薪酬制度?
2019/07/09 职场文书
Go语言使用select{}阻塞main函数介绍
2021/04/25 Golang
vue实现简易音乐播放器
2022/08/14 Vue.js