码迷,mamicode.com
首页 > Web开发 > 详细

Node.js:创建应用+回调函数(阻塞/非阻塞)

时间:2018-05-06 22:53:26      阅读:299      评论:0      收藏:0      [点我收藏+]

标签:没有   厨房   结束   使用   image   角度   span   就会   end   

一、创建应用

  如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi。从这个角度看,整个"接收 HTTP 请求并提供 Web 页面"的需求根本不需要 PHP 来处理。

  不过对 Node.js 来说,概念完全不一样了。使用 Node.js 时,我们不仅仅在实现一个应用,同时还实现了整个 HTTP 服务器。事实上,我们的 Web 应用以及对应的 Web 服务器基本上是一样的。

  在我们创建 Node.js 第一个 "Hello, World!" 应用前,让我们先了解下 Node.js 应用是由哪几部分组成的:

  1. 引入 required 模块:我们可以使用 require 指令来载入 Node.js 模块。

  2. 创建服务器:服务器可以监听客户端的请求,类似于 Apache 、Nginx 等 HTTP 服务器。

  3. 接收请求与响应请求 服务器很容易创建,客户端可以使用浏览器或终端发送 HTTP 请求,服务器接收请求后返回响应数据

1、引入 required 模块

  我们使用 require 指令来载入 http 模块,并将实例化的 HTTP 赋值给变量 http,实例如下:

2、创建服务器

  接下来我们使用 http.createServer() 方法创建服务器,并使用 listen 方法绑定 8888 端口。 函数通过 request, response 参数来接收和响应数据。

  实例如下,在你项目的根目录下创建一个叫 server.js 的文件,并写入以下代码:

var http = require("http")

http.createServer(function(request,response){
    // 发送 HTTP 头部 
    // HTTP 状态值: 200 : OK
    // 内容类型: text/plain
    response.writeHead(200, {Content-Type: text/plain});

    // 发送响应数据 "Hello World"
    response.end(Hello World\n);
}).listen(8888)

// 终端打印如下信息
console.log(Server running at http://127.0.0.1:8888/);

  以上代码我们完成了一个可以工作的 HTTP 服务器。使用 node 命令执行以上的代码,打开浏览器访问 http://127.0.0.1:8888/,你会看到一个写着 "Hello World"的网页。

技术分享图片

  分析Node.js 的 HTTP 服务器:第一行请求(require)Node.js 自带的 http 模块,并且把它赋值给 http 变量。接下来我们调用 http 模块提供的函数: createServer 。这个函数会返回 一个对象,这个对象有一个叫做 listen 的方法,这个方法有一个数值参数, 指定这个 HTTP 服务器监听的端口号。

二、回调函数

  Node.js 异步编程的直接体现就是回调。异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。回调函数在完成任务后就会被调用,Node 使用了大量的回调函数,Node 所有 API 都支持回调函数。例如,我们可以一边读取文件,一边执行其他命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操作。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。

1、阻塞代码实例

var fs = require("fs");
var data = fs.readFileSync(input.txt);

console.log(data.toString());
console.log("程序执行结束!");
//结果:先打印input里面内容,再打印程序结束

2、非阻塞代码实例

var fs = require("fs");
fs.readFile(input.txt, function (err, data) {
    if (err) return console.error(err);
    console.log(data.toString());
});

console.log("程序执行结束!");
//结果:先打印程序结束,再打印input里面内容

  以上两个实例我们了解了阻塞与非阻塞调用的不同。第一个实例在文件读取完后才执行完程序。 第二个实例我们不需要等待文件读取完,这样就可以在读取文件时同时执行接下来的代码,大大提高了程序的性能。

  因此,阻塞是按顺序执行的,而非阻塞是不需要按顺序的,所以如果需要处理回调函数的参数,我们就需要写在回调函数内。

3、阻塞和非阻塞,同步异步的理解

  阻塞和非阻塞,同步和异步是node.js里经常遇到的词汇,我举个简单的例子来说明:

  我要看足球比赛,但是妈妈叫我烧水,电视机在客厅,烧水要在厨房。家里有2个水壶,一个是普通的水壶,另一个是水开了会叫的那种水壶。我可以:

  (1)用普通的水壶烧,人在边上看着,水开了再去看球。(同步,阻塞)这个是常规做法,但是我看球不爽了。

  (2)用普通水壶烧,人去看球,隔几分钟去厨房看看。(同步,非阻塞)这个又大问题,万一在我离开的几分钟水开了,我就麻烦了。

  (3)用会叫的水壶,人在边上看着。(异步,阻塞)这个没有问题,但是我太傻了。

  (4)用会叫的水壶,人去看球,听见水壶叫了再去看。(异步,非阻塞)这个应该是最好的。

  等着看球的我:阻塞,看着电视的我:非阻塞

  普通水壶:同步,会叫的水壶:异步

  所以,异步往往配合非阻塞,才能发挥出威力。

 

Node.js:创建应用+回调函数(阻塞/非阻塞)

标签:没有   厨房   结束   使用   image   角度   span   就会   end   

原文地址:https://www.cnblogs.com/goloving/p/9000022.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!