[Coke,浏览器,JS,Node,js]Node.js开发者必须了解的4个JS要点-阿里云开发者社区

开发者社区> dasein58> 正文

[Coke,浏览器,JS,Node,js]Node.js开发者必须了解的4个JS要点

简介:   1. 非阻塞(Non-blocking)或异步I/O   由于Node.js一个服务器端框架,所以它主要工作之一是处理浏览器请求。在传统的I/O系统中,每个请求的发出都是在上一请求到达之后才发出的。所以这被称为阻塞(blocking)I/O。服务器会阻挡其它的请求以处理当前请求,从而导致浏览器等待。
+关注继续查看

  1. 非阻塞(Non-blocking)或异步I/O

  由于Node.js一个服务器端框架,所以它主要工作之一是处理浏览器请求。在传统的I/O系统中,每个请求的发出都是在上一请求到达之后才发出的。所以这被称为阻塞(blocking)I/O。服务器会阻挡其它的请求以处理当前请求,从而导致浏览器等待。

  Node.js不以这种方式来进行I/O处理。如果一个请求需要长时间处理,Node.js会把该请求发送给一个事件循环(event loop),然后继续处理在调用堆栈(call stack)中的下一请求。当延后请求处理完毕时,它会告知Node.js同时浏览器会做出响应反馈。

  以下使用一个事例来说明。

  Blocking I/O

  1

  2

  3

  4

  5

  6

  7

  8

  9

  10

  11

  12

  13

  14

  15

  // take order for table 1 and wait...

  var order1=orderBlocking(['Coke', 'Iced Tea']);

  // once order is ready, take order back to table.

  serveOrder(order1);

  // once order is delivered, move on to another table.

  // take order for table 2 and wait...

  var order2=orderBlocking(['Coke', 'Water']);

  // once order is ready, take order back to table.

  serveOrder(order2);

  // once order is delivered, move on to another table.

  // take order for table 3 and wait...

  var order3=orderBlocking(['Iced Tea', 'Water']);

  // once order is ready, take order back to table.

  serveOrder(order3);

  // once order is delivered, move on to another table.

  在这个餐馆例子中,服务员接收了菜单指令,等待饭菜处理,然后在饭菜处理完成后把饭菜端到桌子上。在服务员等候饭菜处理期间,他会拒绝其它客人的菜单指令。

  Non-blocking I/O

  1

  2

  3

  4

  5

  6

  7

  8

  9

  10

  11

  12

  // take order for table 1 and move on...

  orderNonBlocking(['Coke', 'Iced Tea'], function(drinks){

  return serveOrder(drinks);

  });

  // take order for table 2 and move on...

  orderNonBlocking(['Beer', 'Whiskey'], function(drinks){

  return serveOrder(drinks);

  });

  // take order for table 3 and move on...

  orderNonBlocking(['Hamburger', 'Pizza'], function(food){

  return serveOrder(food);

  });

  而在非阻塞模式下,服务员会告知厨师他接受到的菜单指令,然后去接收下一桌的指令。当第一桌饭菜处理完毕时,他会为那桌客人上菜,然后继续接收其它客人的指令。这样一来二手域名出售服务员不会由于阻塞指令而造成时间浪费。

  2. 原型(Prototype)

  原型在JS中是一个复杂的概念。在典型继承机制语言如Java或C++中,为了实现代码复用,你必须先创建一个类然后透过它来生成对象或透过类扩展来生成对象。但是在JS中没有类似的类概念。在JS中创建一个对象后,你需要透过它来扩展对象或创建新对象。这就叫做原型继承(prototypal inheritence)。

  每个JS对象都连接着一个原型对象并对并继承该对象的属性。每个对象与预定义JS的Objecttotype相联系。如果你透过objpName或obj['propName'>方式来查找对象属性但查找失败时,这时可尝试通过obj.hasOwnProperty('propName')的方式进行查找,JS运行时会在在原型对象中查找属性。如果属性不存在于原型链中,那么将返回undefined值。

  让我们用以下例子来进行说明:

  1

  2

  3

  4

  5

  6

  7

  if (typeof Object.create !=='function') {

  Object.create=function (o) {

  var F=function () {};

  Ftotype=o;

  return new F();

  };

  var otherPerson=Object.create(person);

  当你创建了一个新对象,你必须选定一个以原型为基础的对象。在这里,我们为对象函数添加了一个create方法。create方法创建了一个以其它对象为原型的对象,并作为参数传入。

  当我们变更新的对象时,它的原型是保持不变的。但是,当我们改动了原型对象,该变更会影响所有基于该原型的对象。

  3. 模块(Modules)

  如果你曾在Java中使用过包,那么Node.js的组件与之类似。如果没有,也不用担心;组件其实是简单的JS文件,用于实现特定的功能。组件模式的意义是让你工作得更加轻松。要使用组件,你必须像在JAVA中导入包一样进行JS文件导入。Node.js中有两种组件

  核心组件(Core Modules)- 核心组件是结合Node.js库被预编译的。其目的是把程序员经常使用的功能开放出来,避免重复劳动。常见的核心组件有HTTP, URL, EVENTS, FILE SYSTEM等等。

  用户自定义组件(UserDefined Modules)- 用户自定义组件是提供给用户使用以实现具体功能的组件。当核心组件不足以满足程序员需要的时候,自定义组件就可派上用场了。

  组件是通过require函数被抽取的。如果这是一个核心组件,那么参数就是组件名。如果这是一个用户自定义组件,那么参数就是其在文件系统中的组件路径。例如:

  1

  2

  3

  4

  // extract a core module like this

  var http=require('http);

  // extract a user defined module like this

  var something=require('./folder1/folder2/folder3/something.js');

  4. 回调(Callbacks)

  在JS中,函数是第一类对象。也就是说你可以像对常规对象那样对函数进行所有操作。例如指派函数到一个变量,把这些作为参数传给方法,把它们声明为对象的属性,甚至是把它们从函数里返回。

  回调在JS中是异步函数,可以作为参数传递给其它函数或从其它函数里执行或返回而后再执行。这是回调的基本概念。

  当我们把一个回调函数作为参数传递给另外的函数时,我们传递的仅仅是函数的定义;换言之,我们不会知道回调函数的执行时间。这完全依赖于回调函数机制。它会在稍后某个时间点进行回调调用。这是Node.js的非阻塞或异步行为的基本概念,可用下例进行说明:

  1

  2

  3

  4

  setTimeout(function() {

  console.log("world");

  }, 2000)

  console.log("hello");

  这是一个最简单的调用。我们把一个匿名函数作为参数进行传递,作用是为setTimeout函数进行控制台的输出记录登记。因为这仅仅是个函数定义,我们不知道函数何时会被执行。这取决于setTimeout函数的second参数,即2S后。

  首先,second记录语句记录了对控制台的输出,2S后,在回调函数中的记录语句记录了输出的内容。

  1

  2

  3

  // output

  hello

  world

  写在最后

  以上4点对Node.js开发者来说是要彻底理解和掌握的,建议多动手来好好体会这4个要点的含义。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10084 0
Node.js开发Web后台服务
一、简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,是全球最大的开源库生态系统。
1272 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13890 0
Node.js开发者有福了!Express 3.0发布
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/8114422 作者:chszs,转载需注明。
786 0
《Node.js 实战》预售: 实例讲解 Node.js 在实战开发中的应用
CNode 社区的 4 位大牛合力撰写的 《Node.js 实战》一书,现在当当、京东、亚马逊、互动等各大网店火热预售中。
143 0
使用Express3.0实现<Node.js开发指南>中的微博系统
特别说明:本实例仅在windows xp sp3系统下测试通过(其它系统未经过测试)。 这本书,之前有评论过,但之前并不清楚express2.x与3.x会有如此大的差异,导致在写例子的过程中痛苦不已。
815 0
+关注
780
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载