轻松创建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实现的一个简单udp广播服务器、客户端
Sep 25 NodeJs
你一定会收藏的Nodejs代码片段
Feb 04 NodeJs
nodejs进阶(6)—连接MySQL数据库示例
Jan 07 NodeJs
NodeJS仿WebApi路由示例
Feb 28 NodeJs
Nodejs进阶:express+session实现简易登录身份认证
Apr 24 NodeJs
nodejs处理图片的中间件node-images详解
May 08 NodeJs
nodejs制作爬虫实现批量下载图片
May 19 NodeJs
nodejs构建本地web测试服务器 如何解决访问静态资源问题
Jul 14 NodeJs
详解nodejs通过代理(proxy)发送http请求(request)
Sep 22 NodeJs
nodejs之koa2请求示例(GET,POST)
Aug 07 NodeJs
nodejs更新package.json中的dependencies依赖到最新版本的方法
Oct 10 NodeJs
NodeJS读取分析Nginx错误日志的方法
May 14 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
一个简单实现多条件查询的例子
2006/10/09 PHP
解析php利用正则表达式解决采集内容排版的问题
2013/06/20 PHP
php实现统计邮件大小的方法
2013/08/06 PHP
理解Javascript_09_Function与Object
2010/10/16 Javascript
DIV菜单层实现代码
2010/11/19 Javascript
javascript温习的一些笔记 基础常用知识小结
2011/06/22 Javascript
js弹出模式对话框,并接收回传值的方法
2013/03/12 Javascript
JS操作图片(增,删,改) 例子
2013/04/17 Javascript
js实现单行文本向上滚动效果实例代码
2013/11/28 Javascript
js(JavaScript)实现TAB标签切换效果的简单实例
2014/02/26 Javascript
提高NodeJS中SSL服务的性能
2014/07/15 NodeJs
简介JavaScript中Math.LOG10E属性的使用
2015/06/14 Javascript
在windows上用nodejs搭建静态文件服务器的简单方法
2016/08/11 NodeJs
在vue项目中使用Nprogress.js进度条的方法
2018/01/31 Javascript
JavaScript实现简单进度条效果
2020/03/25 Javascript
JavaScript鼠标悬停事件用法解析
2020/05/15 Javascript
vue移动端写的拖拽功能示例代码
2020/09/09 Javascript
windows系统下Python环境搭建教程
2017/03/28 Python
Python+Wordpress制作小说站
2017/04/14 Python
Python socket套接字实现C/S模式远程命令执行功能案例
2018/07/06 Python
win10系统下Anaconda3安装配置方法图文教程
2018/09/19 Python
python面向对象法实现图书管理系统
2019/04/19 Python
python全栈知识点总结
2019/07/01 Python
libreoffice python 操作word及excel文档的方法
2019/07/04 Python
python解析yaml文件过程详解
2019/08/30 Python
HTML5自定义视频播放器源码
2020/01/06 HTML / CSS
电话销售经理岗位职责
2013/12/07 职场文书
优秀班集体获奖感言
2014/02/03 职场文书
优秀教师的感人事迹
2014/02/04 职场文书
财务会计自荐信范文
2014/02/21 职场文书
门面房租房协议书
2014/08/20 职场文书
学校交通安全责任书
2014/08/25 职场文书
仓管员岗位职责范本
2015/04/01 职场文书
周恩来的四个昼夜观后感
2015/06/03 职场文书
MySQL中IO问题的深入分析与优化
2022/04/02 MySQL
Windows Server 2012 R2服务器安装与配置的完整步骤
2022/07/15 Servers