Node.js 中的回撥函式

Isaac Tony 2023年10月12日
  1. 在 Node.js 中使用回撥函式同步讀取檔案(阻塞程式碼)
  2. 在 Node.js 中使用回撥函式非同步讀取檔案(非阻塞程式碼)
Node.js 中的回撥函式

回撥函式是在一組任務執行完畢後執行的函式,避免了整個程式的阻塞。回撥函式是在 Node.js 中編寫非同步和非阻塞程式的一個重要方面。

在 JavaScript 中,回撥函式被正式稱為作為引數傳遞給其他函式的函式。由於 JavaScript 函式是按照呼叫順序執行的,因此使用回撥可以讓我們更好地控制函式的執行方式。

假設我們有兩個密切相關的函式,因此一個函式的結果被用作另一個函式的引數。在這種情況下,初始函式將始終阻塞第二個函式,直到初始函式的結果準備好。

但是,使用回撥函式,我們可以確保初始函式在執行完其語句後始終將最後一個函式作為回撥函式執行,如下所示。

function print(callback) {
  callback();
}

在 Node.js 中使用回撥函式同步讀取檔案(阻塞程式碼)

Node.js 回撥構成了執行非同步操作的基礎,使 Node.js 適合開發 I/O 密集型應用程式。此類應用程式通常涉及從伺服器獲取大量資料。

載入大資料是一個漫長的過程,因此在執行其餘部分之前坐等程式完全載入資料並不是一個好習慣。

在下面的示例中,我們使用 Node.js 中的 fs 模組在執行其餘程式碼之前同步讀取資料。

// Write JavaScript code
var fs = require('fs');

var filedata = fs.readFileSync('usersinfo.txt');
console.log(filedata.toString());
console.log('Other parts of the program that execute afterwards');
console.log('End of program execution');

樣本輸出:

First name: john
Last name: Doe
Occupation: Microservices Developer

Other parts of the program that execute afterward
End of program execution

在 Node.js 中使用回撥函式非同步讀取檔案(非阻塞程式碼)

同步讀取檔案會阻止其他程式部分的執行,直到資料被完全讀取。在資料量很大的情況下,我們可能需要等待更長的時間。

但是,如下所示,我們可以執行一個函式,在執行程式的其他部分時使用回撥函式在後臺非同步讀取該資料。

var fs = require('fs');

fs.readFile('usersinfo.txt', function(err, data) {
  if (err) return console.error(err);
  console.log(data.toString());
});
console.log('Other parts of the program that execute afterward');

樣本輸出:

Other parts of the program that execute afterward
firstname: john
lastname: Doe
Occupation: Microservices Developer

使用上述程式中的回撥函式概念,我們可以在後臺載入資料時執行程式的其他部分。

此外,在上面的程式碼中,我們還遵循了將錯誤作為回撥函式的第一個引數返回的標準約定。第一個物件,如果非空,應該被認為是錯誤物件;否則,它應該保持為空。

它提供了一種更簡單的方法來了解發生了錯誤。傳統上,由於回撥函式是在主函式執行完其他操作後執行的,因此將其作為第二個引數是一種常見的做法。

實際上,任何使用回撥函式的非同步函式都應該遵循 Node.js 中的以下語法。

function asyncOperation(param1, param2, callback) {
  // operations to be executed
  if (err) {
    console.log('An error has occured!');
    return callback(new Error('An error'));
  }
  // ... more work ...
  callback(null, param1, param2);
}

asyncOperation(parameters, function(err, returnValues) {
  // This code gets run after the async operation
});
作者: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn

相關文章 - Node.js Callback