Node.js回撥概念


什麼是回撥?

回撥是一個非同步等效的功能。在完成特定任務回撥函式被呼叫。 Node大量使用了回撥。Node的所有的API都支援回撥這樣的一種方式。

例如,一個函式讀取一個檔案可能開始讀取檔案,並使得下一個指令可以被執行立即返回控制到執行環境。一旦檔案I/O完成後,它會呼叫回撥函式,同時傳遞回撥函式,該檔案的內容作為引數。因此,有沒有堵塞或等待檔案I/ O。這使得Node.js高度可延伸,因為它可以處理大量的請求,而無需等待任何函式來返回結果。

阻塞程式碼例子

建立一個名為input.txt的檔案有以下內容的文字

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

建立一個js檔案名為main.js裡面有如下程式碼:

var fs = require("fs");

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

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

現在執行main.js看到的結果:

$ node main.js

驗證輸出

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

非阻塞程式碼例子

建立一個名為input.txt的檔案有以下內容的文字

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");

現在執行main.js看到的結果:

$ node test.js

驗證輸出

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

這兩個例子說明阻塞和非阻塞呼叫的概念。第一個例子說明程式塊,直到它讀取該檔案,然後只前進到結束程式的地方。在第二個例子中,程式不等待檔案讀取,但它只是進行列印“Program Ended”,並同時程式無阻塞繼續讀取檔案。

因此,阻擋程式執行在序列,從程式設計點檢視其更容易實現的邏輯,但非阻塞方案並不按順序執行,這樣的情況下一個程式需要使用的任何資料進行處理,它應保持使用式相同的塊,使之按順序執行。