Nodejs - 事件和函數


前面我們已經配置好了Nodejs的環境。接下來我們可以使用node做一些事情。

我們可以在Nodejs REPL(交互式解釋器)中輸入命令。嘗試

  讀取 - 讀取用戶輸入,解析輸入了Javascript數據結構並存儲在內存中。

  執行 - 執行輸入的數據結構

  打印 - 輸出結果

  循環 - 循環操作以上步驟知道用戶兩次按下ctrl + c按鈕退出。

首先我們來介紹一下REPL有那些命令:

  • ctrl + c - 退出當前終端。

  • ctrl + c 按下兩次 - 退出 Node REPL。

  • ctrl + d - 退出 Node REPL.

  • 向上/向下 鍵 - 查看輸入的歷史命令

  • tab 鍵 - 列出當前命令

  • .help - 列出使用命令

  • .break - 退出多行表達式

  • .clear - 退出多行表達式

  • .save filename - 保存當前的 Node REPL 會話到指定文件

  • .load filename - 載入當前 Node REPL 會話的文件內容。

接着我們就可以進入node,使用node命令進入node 命令輸入窗口,我們可以發現左側的 > ,我們就可以輸入運算 10 + 10 回車可以得到運行結果

我們也可以像在Javascript中定義變量。var x = 10 , 接着 console.log 輸出x變量的值 ,。

我們還可以輸入多行表達式,這點類似Javascript。。。。三個點是系統自動生成的。Node會自動檢測是否為連續表達式。

$ node
> 10 + 10
undefined
20> var x = 10
undefined> console.log(x) 10 undefined
> do { ... x++; ... console.log("x: " + x); ... } while ( x < 5 ); x: 1 x: 2 x: 3 x: 4 x: 5 undefined

 

Nodejs 回調函數

Nodejs 異步變成的直接體現就是回調。異步編程依托於回調來實現。但不能說使用了回調函數程序就異步化了。

回調函數在完成任務后就會被調用。Node大量使用了回調函數。Node所有的API都支持回調函數。回調函數一般作為函數的最后一個參數出現。

//同步代碼實例
//創建一個文件 input.txt ,內容如下: This is input text file
//創建input.js與input.txt同級
var fs = require("fs"); var data = fs.readFileSync('input.txt'); console.log(data.toString()); console.log("Game Over!");

我們可以發現輸出結果的順序是:

那我們使用異步代碼會出現什么樣的結果勒?

var fs = require("fs");

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

  console.log(data.toString());
});


console.log("Game Over!");

我們發現Game Over先輸出。應為readFile並不會阻塞程序。向下執行。當readyFile獲取到結果之后會調用回調函數輸出input.txt 內容

事件循環

由於Nodejs是單進程單線程引用程序。但應為V8引擎提供的回調函數。通過這些接口可以處理大量的並發,所以性能非常高。

單線程類似進入while(true) 的事件循環。知道沒有事件觀察者則退出。因為每一個時間都會生成一個時間觀察者。如果有時間發生就調用回調函數

Nodejs使用時間驅動模型,當web server 接收到請求,就會把它關閉然后進行處理。接着去服務下一個web請求,當這個請求完成。就會放回處理隊列中。當達到隊列開頭結果就會返回給用戶。

這個模型非常高效,擴展性非常強。應為web server不等待任何讀寫,也不等待操作完成。此模型被稱為非阻塞/驅動IO

Nodejs有多個內置時間。都是用過EventEmitter類來綁定和監聽時間。EventEmitter 存在於events模塊中。所以我們想要使用EventEmitter 對象我們需要引入event模塊

// 引入 events 模塊
var events = require('events');
// 創建 eventEmitter 對象
var eventEmitter = new events.EventEmitter();

接下來我們就可以把時間綁定到eventEmitter中。 並可以通過emit方法出發事件。

// 綁定事件及事件的處理程序
eventEmitter.on('eventName', function(){
  //process function here.
});
// 觸發事件 eventEmitter.emit('eventName');

創建event.js如下:

var events = require("events");

var eventEmitter = new events.EventEmitter();

eventEmitter.on('connectionWebSocket',function(){
    console.log('connection to websocket');
    eventEmitter.emit('openWebSocket');
});

eventEmitter.on('openWebSocket',function(){
    console.log('open websocket');
});

eventEmitter.emit('connectionWebSocket');

console.log('Connection Finished.');

我們通過node event.js可以看到如下結果。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM