node.js學習日記(2)

REPL

REPL(Read Eval Print Loop:交互式解釋器) 表示一個電腦的環境,類似 Window 系統的終端或 Unix/Linux shell,我們可以在終端中輸入命令,並接收系統的響應。
Node 自帶了交互式解釋器,可以執行以下任務:

  • 讀取 - 讀取用戶輸入,解析輸入了Javascript 數據結構並存儲在內存中。
  • 執行 - 執行輸入的數據結構
  • 打印 - 輸出結果
  • 循環 - 循環操作以上步驟直到用戶兩次按下 ctrl-c 按鈕退出。

具體使用

在命令行輸入“node”來啓動node終端。

  • 簡單表達式
    • 數學運算
  • 變量
    • 變量聲明需要使用 var 關鍵字,如果沒有使用 var 關鍵字變量會直接打印出來。
      使用 var 關鍵字的變量可以使用 console.log() 來輸出變量。
  • 多行表達式
    • 類似JavaScript
    • .break和.clear命令可以退出多行表達式
  • 下劃線變量
    • 使用下劃線(_)獲取表達式的運算結果

這裏寫圖片描述 這裏寫圖片描述 這裏寫圖片描述

事件循環

Node.js 是單進程單線程應用程序,但是通過事件和回調支持併發,所以性能非常高。
Node.js 單線程類似進入一個while(true)的事件循環,直到沒有事件觀察者退出,每個異步事件都生成一個事件觀察者,如果有事件發生就調用該回調函數。

事件驅動程序

當web server接收到請求,就把它關閉然後進行處理,然後去服務下一個web請求。
當這個請求完成,它被放回處理隊列,當到達隊列開頭,這個結果被返回給用戶。
這個模型非常高效可擴展性非常強,因爲web server一直接受請求而不等待任何讀寫操作。
在事件驅動模型中,會生成一個主循環來監聽事件,當檢測到事件時觸發回調函數。
這裏寫圖片描述

EventEmitter

Node.js 所有的異步 I/O 操作在完成時都會發送一個事件到事件隊列。
例如一個net.Server對象會在每次有新連接時分發一個事件, 一個fs.readStream對象會在文件被打開的時候發出一個事件。 所有這些產生事件的對象都是 events.EventEmitter 的實例。

  • 引入 events 模塊
    • var events = require('events');
  • 創建 eventEmitter 對象
    • var eventEmitter = new events.EventEmitter();
  • 綁定事件及事件的處理程序

    • eventEmitter.on('eventName', eventHandler);
    • eventEmitter.addListener('eventName', eventHandler);
    • 由一個事件名和若干個參數組成,事件名是一個字符串,通常表達一定的語義。對於每個事件,EventEmitter 支持若干個事件監聽器。
  • 觸發事件

    • eventEmitter.emit('eventName', [arg1], [arg2], [...]);
    • 當事件觸發時,註冊到這個事件的事件監聽器被依次調用,事件參數作爲回調函數參數傳遞。
var events = require('events');
var emitter = new events.EventEmitter();

function handler1(arg1, arg2) {
    console.log('listener1', arg1, arg2);
}

emitter.on('someEvent', handler1);
emitter.on('someEvent', function(arg1) {
    console.log('listener2', arg1);
});
emitter.emit('someEvent', '參數1', '參數2');

這裏寫圖片描述

EventEmitter 對象如果在實例化時發生錯誤,會觸發 ‘error’ 事件。當添加新的監聽器時,’newListener’ 事件會觸發,當監聽器被移除時,’removeListener’ 事件被觸發。

大多數時候我們不會直接使用 EventEmitter,而是在對象中繼承它。包括 fs、net、 http 在內的,只要是支持事件響應的核心模塊都是 EventEmitter 的子類。

回調函數

Node.js異步編程的直接體現是回調。Node所有API都支持回調函數,回調函數在完成任務後會被調用。
異步編程依託於回調來實現,但不能說使用了回調後程序就異步化了。
可以實現高性能的非阻塞的I/O操作(阻塞/非阻塞無所謂同步/異步)。
在 Node 應用程序中,執行異步操作的函數將回調函數作爲最後一個參數, 回調函數接收錯誤對象作爲第一個參數。用於接收錯誤信息。

阻塞實例

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

console.log(data.toString());
console.log("程序執行結束!");

這裏寫圖片描述
可以看出,必須在文件讀取完後才能執行後續程序。阻塞是按順序執行的。

非阻塞實例

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

console.log("程序執行結束!");

這裏寫圖片描述
不需要等待文件讀取完,可以在讀取文件時同時執行接下來的代碼,大大提高了程序的性能。


自己加油加油,笨鳥後飛也要飛呀飛

`

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章