Bài 5: Hướng dẫn sử dụng Hàm trong Node.js với ví dụ minh họa chi tiết
Hàm là một khái niệm quen thuộc trong lập trình, cũng như trong Node.js. Hàm cho phép tái sử dụng mã lệnh và giúp code của bạn dễ đọc và dễ bảo trì hơn. Trong bài viết này, chúng ta sẽ tìm hiểu cách sử dụng hàm trong Node.js và cung cấp một số ví dụ cụ thể.
Nội dung của bài
I. Khái niệm về hàm
Hàm là một khối mã lệnh độc lập có thể được tái sử dụng nhiều lần trong một chương trình. Hàm có thể nhận đầu vào (được gọi là tham số hoặc đối số) và trả về đầu ra (được gọi là giá trị trả về hoặc kết quả).
Trong Node.js, bạn có thể tạo hàm bằng từ khóa function
. Ví dụ:
function add(a, b) {
return a + b;
}
Trong ví dụ trên, chúng ta đã tạo một hàm tên là add
nhận hai tham số a
và b
, và trả về tổng của hai tham số đó. Chúng ta có thể gọi hàm này bằng cách sử dụng tên hàm và truyền vào hai tham số.
let result = add(2, 3);
console.log(result); // output: 5
II. Các loại hàm trong Node.js
Trong Node.js, có ba loại hàm chính: hàm đồng bộ (synchronous), hàm bất đồng bộ (asynchronous) và hàm generator. Chúng ta sẽ tìm hiểu lần lượt về từng loại hàm này.
1. Hàm bất đồng bộ (Asynchronous functions)
Trong Node.js, hầu hết các thao tác I/O (input/output) đều là bất đồng bộ (asynchronous), có nghĩa là thao tác sẽ không chờ đợi cho đến khi kết thúc mà thực hiện song song với các tác vụ khác. Vì vậy, các hàm bất đồng bộ là rất quan trọng trong Node.js.
Cú pháp của một hàm bất đồng bộ là sử dụng từ khóa “async” trước tên hàm, và trong hàm này phải sử dụng từ khóa “await” khi thực hiện các tác vụ bất đồng bộ để đợi đến khi chúng hoàn thành.
Ví dụ:
async function fetchData() {
const data = await getDataFromAPI(); // Hàm này trả về Promise
console.log(data);
}
2. Hàm đồng bộ (Synchronous function)
Hàm đồng bộ là các hàm chạy tuần tự, chờ đợi một tác vụ thực hiện xong trước khi thực hiện tác vụ tiếp theo. Trong Node.js, hầu hết các hàm xử lý không liên quan đến I/O đều là đồng bộ.
Ví dụ:
function addNumbers(a, b) {
return a + b;
}
3. Hàm callback (Callback functions)
Callback là một hàm được truyền vào một hàm khác như là một đối số. Sau khi hàm đó thực hiện xong, nó sẽ gọi lại hàm callback để trả kết quả về cho hàm gốc.
Ví dụ:
function fetchData(callback) {
const data = getDataFromAPI();
callback(data);
}
function processResult(data) {
console.log(data);
}
fetchData(processResult);
4. Hàm Generator (Generator functions)
Hàm Generator cho phép tạm dừng và tiếp tục thực hiện hàm, và trả về một iterable object. Hàm Generator được kích hoạt bằng cách sử dụng từ khóa “yield”.
Ví dụ:
function* generateSequence() {
yield 1;
yield 2;
yield 3;
}
const generator = generateSequence();
console.log(generator.next().value); // 1
console.log(generator.next().value); // 2
console.log(generator.next().value); // 3
5. Hàm Arrow (Arrow functions)
Hàm Arrow (Arrow functions) là một cú pháp mới giúp viết các hàm ngắn gọn hơn trong JavaScript. Trong Node.js, Arrow functions cũng được hỗ trợ và được sử dụng rộng rãi bởi các lập trình viên.
Với cú pháp ngắn gọn và dễ đọc, Arrow functions có thể giúp cho code của bạn trở nên dễ hiểu hơn. Nó cũng có thể giúp tăng tốc độ viết code của bạn bởi vì bạn không cần phải viết các từ khóa function và return.
Cú pháp của Arrow function như sau:
(param1, param2, …, paramN) => { statements }
Hoặc nếu hàm chỉ có một tham số:
param => { statements }
Hoặc nếu hàm không có tham số:
() => { statements }
Ví dụ:
// Hàm Arrow với một tham số
const square = x => x * x;
// Hàm Arrow với nhiều tham số
const sum = (x, y) => x + y;
// Hàm Arrow không có tham số
const hello = () => console.log('Hello World!');
// Sử dụng hàm Arrow trong hàm map()
const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map(x => x * 2);
console.log(doubled); // [2, 4, 6, 8, 10]
Lưu ý rằng, Arrow functions không có một bản thân this, mà sẽ tham chiếu đến this của phạm vi bao ngoài nó. Điều này có thể gây nhầm lẫn nếu bạn không hiểu rõ về cách hoạt động của Arrow functions.
Trong Node.js, bạn có thể sử dụng Arrow functions để viết các hàm ngắn gọn và dễ hiểu hơn. Tuy nhiên, khi sử dụng Arrow functions, hãy chú ý đến phạm vi của this để tránh gặp phải các lỗi không mong muốn.
Trong bài viết này, chúng ta đã tìm hiểu về các loại hàm trong Node.js, từ các hàm thông thường cho đến các hàm callback, hàm async và await, và hàm Arrow functions. Hy vọng rằng những thông tin này sẽ giúp bạn nắm vững các kiến thức cơ bản về hàm trong Node.js và có thể sử dụng chúng trong các dự án thực tế của mình.
III. Ví dụ về sử dụng hàm trong Node.js
Để minh họa cho việc sử dụng hàm trong Node.js, chúng ta sẽ viết một ví dụ đơn giản về hàm tính tổng của hai số.
Đầu tiên, chúng ta sẽ tạo một file tên là sum.js
. Trong file này, chúng ta sẽ định nghĩa một hàm có tên là sum
như sau:
function sum(a, b) {
return a + b;
}
module.exports = sum;
Hàm sum
nhận vào hai tham số a
và b
, sau đó trả về tổng của hai số này bằng cách sử dụng toán tử +
. Cuối cùng, chúng ta sử dụng lệnh module.exports
để xuất hàm sum
ra ngoài module.
Sau đó, chúng ta có thể sử dụng hàm sum
trong một file khác bằng cách import nó vào như sau:
const sum = require('./sum');
console.log(sum(2, 3)); // 5
Ở đây, chúng ta sử dụng lệnh require
để import hàm sum
từ file sum.js
vào trong file hiện tại. Sau đó, chúng ta gọi hàm sum
với hai tham số là 2
và 3
, và in ra kết quả là 5
bằng cách sử dụng console.log()
.
IV. Kết luận
Như vậy, chúng ta đã tìm hiểu về hàm trong Node.js, một khái niệm rất quan trọng trong lập trình. Chúng ta đã biết cách định nghĩa hàm, truyền tham số vào hàm, và trả về kết quả từ hàm. Chúng ta cũng đã học cách sử dụng module để xuất và import các hàm giữa các file trong Node.js.
Hy vọng bài viết này sẽ giúp bạn hiểu rõ hơn về hàm trong Node.js và có thể áp dụng chúng vào các dự án thực tế của mình.