Like Share Discussion Bookmark Smile

J.J. Huang   2020-01-18   Node.js   瀏覽次數:

Node.js | Callback(回調函數概念)

簡介

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

例如:我們可以一邊讀取文件,一邊執行其他指令,在文件讀取完成後,我們將文件內容作為回調函數的參數返回。這樣在執行程式時就沒有阻塞或等待文件I/O操作。這就大大提高了Node.js的性能,可以處理大量的並發請求。

回調函數一般作為函數的最後一個參數出現:

1
2
function foo1(name, age, callback) { }
function foo2(value, callback1, callback2) { }

範例說明

阻塞程式範例

首先在目錄下建立一個input.txt檔。
內容輸入:

1
J.J.'s Blogs 技術筆記 http://localhost:4000/

在建立main.js檔。
程式碼如下:

1
2
3
4
5
6
var fs = require("fs");

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

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

執行結果:

1
2
3
$ node main.js
J.J.'s Blogs 技術筆記 http://localhost:4000/
執行結束!

非阻塞程式範例

首先在目錄下建立一個input.txt檔。
內容輸入:

1
J.J.'s Blogs 技術筆記 http://localhost:4000/

在建立main.js檔。
程式碼如下:

1
2
3
4
5
6
7
8
var fs = require("fs");

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

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

執行結果:

1
2
3
$ node main.js
執行結束!
J.J.'s Blogs 技術筆記 http://localhost:4000/

總結

以上兩個範例我們了解了阻塞與非阻塞調用的不同。

第一個範例在文件讀取完後才執行程序。
第二個範例我們不需要等待文件讀取完,這樣就可以在讀取文件時同時執行接下來的程式,大大提高了程序的性能。

因此,阻塞是按順序執行的,而非阻塞是不需要按順序的,所以如果需要處理回調函數的參數,我們就需要寫在回調函數內。


註:以上參考了
Node.js 回调函数