鍍金池/ 教程/ HTML/ Node.js回調(diào)概念
Node.js快速入門
Node.js事件發(fā)射器
Node.js包(JXcore)
Node.js事件循環(huán)
Node.js文件系統(tǒng)
Node.js npm
Node.js安裝和入門
Node.js工具模塊
Node.js回調(diào)概念
Node.js流
Node.js入門實(shí)例程序
Node.js教程
Node.js規(guī)范化應(yīng)用
Node.js REPL終端
Node.js緩沖器
Node.js RESTful API
Node.js全局對(duì)象
Linux安裝Node.js(源碼編譯安裝)
Node.js Web模塊
Node.js Express框架

Node.js回調(diào)概念

什么是回調(diào)?

回調(diào)是一個(gè)異步等效的功能。在完成特定任務(wù)回調(diào)函數(shù)被調(diào)用。 Node大量使用了回調(diào)。Node的所有的API都支持回調(diào)這樣的一種方式。

例如,一個(gè)函數(shù)讀取一個(gè)文件可能開始讀取文件,并使得下一個(gè)指令可以被執(zhí)行立即返回控制到執(zhí)行環(huán)境。一旦文件I/O完成后,它會(huì)調(diào)用回調(diào)函數(shù),同時(shí)傳遞回調(diào)函數(shù),該文件的內(nèi)容作為參數(shù)。因此,有沒有堵塞或等待文件I/ O。這使得Node.js高度可擴(kuò)展,因?yàn)樗梢蕴幚泶罅康恼?qǐng)求,而無需等待任何函數(shù)來返回結(jié)果。

阻塞代碼例子

創(chuàng)建一個(gè)名為input.txt的文件有以下內(nèi)容的文本

Yiibai Point is giving self learning content
to teach the world in simple and easy way!!!!!

創(chuàng)建一個(gè)js文件名為main.js里面有如下代碼:

var fs = require("fs");

var data = fs.readFileSync('input.txt');

console.log(data.toString());
console.log("Program Ended");

現(xiàn)在運(yùn)行main.js看到的結(jié)果:

$ node main.js

驗(yàn)證輸出

Yiibai Point is giving self learning content
to teach the world in simple and easy way!!!!!
Program Ended

非阻塞代碼例子

創(chuàng)建一個(gè)名為input.txt的文件有以下內(nèi)容的文本

Yiibai Point is giving self learning content
to teach the world in simple and easy way!!!!!

更新main.js文件如以下代碼:

var fs = require("fs");

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

console.log("Program Ended");

現(xiàn)在運(yùn)行main.js看到的結(jié)果:

$ node test.js

驗(yàn)證輸出

Program Ended
Yiibai Point is giving self learning content
to teach the world in simple and easy way!!!!!

這兩個(gè)例子說明阻塞和非阻塞調(diào)用的概念。第一個(gè)例子說明程序塊,直到它讀取該文件,然后只前進(jìn)到結(jié)束程序的地方。在第二個(gè)例子中,程序不等待文件讀取,但它只是進(jìn)行打印“Program Ended”,并同時(shí)程序無阻塞繼續(xù)讀取文件。

因此,阻擋程序執(zhí)行在序列,從編程點(diǎn)查看其更容易實(shí)現(xiàn)的邏輯,但非阻塞方案并不按順序執(zhí)行,這樣的情況下一個(gè)程序需要使用的任何數(shù)據(jù)進(jìn)行處理,它應(yīng)保持使用式相同的塊,使之按順序執(zhí)行。