乐博娱乐»NodeJS»Node.js乐博娱乐开发者必须了解的4个JS要点

Node.js乐博娱乐开发者必须了解的4个JS要点

来源:csdn 宣布时间:2015-12-18 阅读次数:乐博

  Node.js是一个面向服务器的框架,立足于Chrome强大的V8 JS引擎。尽管它由C++编写而成,但是它及其应用是运行在JS上的。本文为乐博娱乐开发者总结了4个Node.js要点。

乐博

  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

// 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

// 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的Object.prototype相联系。如果你透过obj.propName或obj['propName'>方式来查找工具属性但查找失败时,这时可实验通过obj.hasOwnProperty('propName')的方式进行查找,JS运行时会在在原型工具中查找属性。如果属性不存在于原型链中,那么将返回undefined值。

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

if (typeof Object.create !== 'function') {  
    Object.create = function (o) {  
        var F = function () {};  
        F.prototype = 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函数被抽取的。如果这是一个焦点组件,那么参数就是组件名。如果这是一个用户自界说组件,那么参数就是其在文件系统中的组件路径。例如:

// 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的非阻塞或异步行为的基本看法,可用下例进行说明:

setTimeout(function() {  
    console.log("world");  
}, 2000)  
console.log("hello");   

  这是一个最简朴的调用。我们把一个匿名函数作为参数进行通报,作用是为setTimeout函数进行控制台的输出纪录挂号。因为这仅仅是个函数界说,我们不知道函数何时会被执行。这取决于setTimeout函数的second参数,即2S后。

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

// output  
hello  
world  

  写在最后

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

  原文出自: Dzone