Hướng dẫn hứa hẹn của Node.js

Trong các hướng dẫn trước, bạn đã thấy các hàm gọi lại được sử dụng cho các sự kiện không đồng bộ. Nhưng đôi khi các hàm gọi lại có thể trở thành cơn ác mộng khi chúng bắt đầu được lồng vào nhau và chương trình bắt đầu trở nên dài và phức tạp.

Những lời hứa là gì?

Trước khi bắt đầu với lời hứa, trước tiên chúng ta hãy xem lại các hàm “gọi lại” trong Node.js là gì. Chúng ta đã thấy các hàm gọi lại này rất nhiều trong các chương trước, vì vậy hãy cùng điểm qua nhanh một trong số chúng.

Ví dụ dưới đây hiển thị một đoạn mã được sử dụng để kết nối với một MongoDB cơ sở dữ liệu và thực hiện thao tác cập nhật trên một trong các bản ghi trong cơ sở dữ liệu.

Lời hứa của Node.js

  1. Trong đoạn mã trên, một phần của hàm (err,db) được gọi là phần khai báo của hàm ẩn danh hoặc hàm gọi lại. Khi MongoClient tạo kết nối tới MongoDB cơ sở dữ liệu, nó sẽ trở lại chức năng gọi lại sau khi thao tác kết nối hoàn tất. Vì vậy, theo một nghĩa nào đó, các hoạt động kết nối diễn ra ở chế độ nền và khi hoàn tất, nó sẽ gọi hàm gọi lại của chúng ta. Hãy nhớ rằng đây là một trong những điểm chính của Node.js để cho phép nhiều thao tác diễn ra đồng thời và do đó không chặn bất kỳ người dùng nào thực hiện một thao tác.
  2. Khối mã thứ hai là khối được thực thi khi hàm gọi lại thực sự được gọi. Hàm gọi lại chỉ cập nhật một bản ghi trong MongoDB cơ sở dữ liệu.

Vậy lời hứa là gì? Chà, lời hứa chỉ là một cải tiến cho các hàm gọi lại trong Node.js. Trong vòng đời phát triển, có thể có trường hợp bạn cần lồng nhiều hàm gọi lại với nhau. Điều này có thể trở nên lộn xộn và khó duy trì tại một thời điểm nhất định. Tóm lại, lời hứa là một tính năng nâng cao cho các cuộc gọi lại nhằm giảm bớt những vấn đề này.

Cú pháp cơ bản của một lời hứa được hiển thị bên dưới;

var promise = doSomethingAync()
promise.then(onFulfilled, onRejected)
  • “doSomethingAync” là bất kỳ hàm gọi lại hoặc hàm bất đồng bộ nào thực hiện một số loại xử lý.
  • Lần này, khi xác định lệnh gọi lại, có một giá trị được trả về được gọi là “lời hứa”.
  • Khi một lời hứa được trả lại, nó có thể có 2 kết quả đầu ra. Điều này được xác định bởi 'mệnh đề then'. Thao tác có thể thành công được biểu thị bằng tham số 'onFulfilled'. Hoặc nó có thể có lỗi được biểu thị bằng tham số 'onRejected'.

Lưu ý: Vì vậy, khía cạnh quan trọng của một lời hứa là giá trị trả về. Không có khái niệm về giá trị trả về khi làm việc với các lệnh gọi lại thông thường trong Node.js. Do giá trị trả về, chúng ta có nhiều quyền kiểm soát hơn về cách xác định hàm gọi lại.

Trong chủ đề tiếp theo, chúng ta sẽ xem ví dụ về lời hứa và lợi ích của chúng từ lệnh gọi lại.

Gọi lại lời hứa

Bây giờ hãy xem một ví dụ về cách chúng ta có thể sử dụng “promises” trong ứng dụng Node.js. Để sử dụng lời hứa trong ứng dụng Node.js, trước tiên bạn phải tải xuống và cài đặt mô-đun 'lời hứa'.

Sau đó, chúng tôi sẽ sửa đổi mã của mình như hiển thị bên dưới, cập nhật Tên nhân viên trong bộ sưu tập 'Nhân viên' bằng cách sử dụng lời hứa.

Bước 1) Cài đặt mô-đun NPM

Để sử dụng Lời hứa từ bên trong ứng dụng Node JS, cần có mô-đun lời hứa. Để cài đặt mô-đun lời hứa, hãy chạy lệnh bên dưới

lời hứa cài đặt npm

Bước 2) Sửa đổi mã để bao gồm những lời hứa

Gọi lại lời hứa

var Promise = require('promise');
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost/EmployeeDB';

MongoClient.connect(url)
    .then(function(err, db) {
        db.collection('Employee').updateOne({
            "EmployeeName": "Martin"
        }, {
            $set: {
                "EmployeeName": "Mohan"
            }
        });
    }); 

Giải thích mã: -

  1. Phần đầu tiên bao gồm mô-đun 'lời hứa' sẽ cho phép chúng ta sử dụng chức năng lời hứa trong mã của mình.
  2. Bây giờ chúng ta có thể nối hàm 'then' vào hàm MongoClient.connect của mình. Vì vậy, điều này có nghĩa là khi kết nối được thiết lập với cơ sở dữ liệu, chúng ta cần thực thi đoạn mã được xác định sau đó.
  3. Cuối cùng, chúng tôi xác định đoạn mã thực hiện công việc cập nhật Tên nhân viên của nhân viên có tên “Martin” thành “Mohan”.

Lưu ý: -

Nếu bây giờ bạn kiểm tra nội dung của MongoDB cơ sở dữ liệu, bạn sẽ thấy rằng nếu tồn tại một bản ghi có Tên nhân viên là “Martin”, nó sẽ được cập nhật thành “Mohan”.

Để kiểm tra xem dữ liệu đã được chèn đúng vào cơ sở dữ liệu chưa, bạn cần thực hiện các lệnh sau trong MongoDB

  1. Sử dụng cơ sở dữ liệu nhân viên
  2. db.Employee.find({Tên nhân viên :Mohan })

Câu lệnh đầu tiên đảm bảo rằng bạn được kết nối với cơ sở dữ liệu StaffDb. Câu lệnh thứ hai tìm kiếm bản ghi có tên nhân viên là “Mohan”.

Xử lý các lời hứa lồng nhau

Khi xác định lời hứa, cần lưu ý rằng chính phương thức “then” sẽ trả về một lời hứa. Vì vậy, theo một nghĩa nào đó, các lời hứa có thể được lồng vào nhau hoặc xâu chuỗi với nhau.

Trong ví dụ bên dưới, chúng tôi sử dụng chuỗi để xác định 2 hàm gọi lại, cả hai đều chèn một bản ghi vào MongoDB cơ sở dữ liệu.

(Chú thích: Chuỗi là một khái niệm được sử dụng để liên kết việc thực thi các phương thức với nhau. Giả sử nếu ứng dụng của bạn có 2 phương thức gọi là 'methodA' và 'methodB.' Và logic là 'methodB' phải được gọi sau 'methodA', sau đó bạn sẽ xâu chuỗi việc thực thi theo cách mà 'methodB' được gọi trực tiếp sau 'methodA.')

Điều quan trọng cần lưu ý trong ví dụ này là mã trở nên sạch hơn, dễ đọc và bảo trì hơn bằng cách sử dụng các lời hứa lồng nhau.

Xử lý các lời hứa lồng nhau

var Promise = require('promise');
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost/EmployeeDB';
MongoClient.connect(url)

.then(function(db) {
    db.collection('Employee').insertOne({
        Employeeid: 4,
        EmployeeName: "NewEmployee"
    })

    .then(function(db1) {
        db1.collection('Employee').insertOne({
            Employeeid: 5,
            EmployeeName: "NewEmployee1"
        })
    })
});

Giải thích mã: -

  1. Bây giờ chúng ta đang định nghĩa 2 mệnh đề “then” được thực thi lần lượt. Trong mệnh đề then đầu tiên, chúng ta truyền tham số 'db' chứa kết nối cơ sở dữ liệu của chúng ta. Sau đó, chúng tôi sử dụng thuộc tính bộ sưu tập của kết nối 'db' để chèn bản ghi vào bộ sưu tập 'Nhân viên'. Phương thức 'insertOne' được sử dụng để chèn tài liệu thực tế vào bộ sưu tập Nhân viên.
  2. Sau đó chúng tôi đang sử dụng 2nd mệnh đề then cũng để chèn một bản ghi khác vào cơ sở dữ liệu.

Nếu bây giờ bạn kiểm tra nội dung của MongoDB cơ sở dữ liệu, bạn sẽ tìm thấy 2 bản ghi được chèn vào MongoDB cơ sở dữ liệu.

Tạo một lời hứa tùy chỉnh

Bạn có thể tạo lời hứa tùy chỉnh bằng cách sử dụng mô-đun nút có tên 'q.' Thư viện 'q' cần được tải xuống và cài đặt bằng trình quản lý gói nút. Sau khi sử dụng thư viện 'q', phương thức “denodeify” có thể được gọi, phương thức này sẽ khiến bất kỳ hàm nào trở thành hàm trả về một lời hứa.

Trong ví dụ bên dưới, chúng ta sẽ tạo một hàm đơn giản có tên là “Add” để cộng 2 số. Chúng ta sẽ chuyển hàm này thành hàm trả lại một lời hứa.

Sau khi hoàn tất, chúng ta sẽ sử dụng lời hứa được hàm Add trả về để hiển thị thông báo trong console.log.

Hãy làm theo các bước dưới đây để tạo chức năng tùy chỉnh nhằm trả lại lời hứa.

Bước 1) Cài đặt mô-đun NPM

Để sử dụng 'q' từ bên trong ứng dụng Node JS, cần có mô-đun 'q'. Để cài đặt mô-đun 'q', hãy chạy lệnh bên dưới

npm cài đặt q

Bước 2) Xác định đoạn mã sau sẽ được sử dụng để tạo lời hứa tùy chỉnh.

Tạo một lời hứa tùy chỉnh

Giải thích mã: -

  1. Bit đầu tiên là bao gồm thư viện 'q' bằng cách sử dụng từ khóa yêu cầu. Bằng cách sử dụng thư viện này, chúng ta sẽ có thể xác định bất kỳ hàm nào để trả về một lệnh gọi lại.
  2. Chúng tôi đang tạo một hàm tên là Add để cộng 2 số được xác định trong biến a và b. Tổng các giá trị này sẽ được lưu trữ trong biến c.
  3. Sau đó, chúng ta sử dụng thư viện q để khử nút (phương pháp được sử dụng để chuyển đổi bất kỳ hàm nào thành hàm trả về lời hứa) hàm Add của chúng ta hoặc chuyển đổi hàm Add thành hàm trả về lời hứa.
  4. Bây giờ chúng tôi gọi hàm “Thêm” và có thể nhận được giá trị lời hứa trả lại do bước trước đó chúng tôi đã thực hiện để mã hóa hàm Thêm.
  5. Từ khóa 'then' được sử dụng để xác định rằng nếu hàm được thực thi thành công thì sẽ hiển thị chuỗi “Hàm bổ sung đã hoàn thành” trong console.log.

Khi đoạn mã trên được chạy, đầu ra “Chức năng bổ sung đã hoàn thành” sẽ được hiển thị trong console.log như hiển thị bên dưới.

Tạo một lời hứa tùy chỉnh

Tổng kết

  • Việc sử dụng các hàm gọi lại trong Node.js cũng có những nhược điểm. Đôi khi trong quá trình phát triển, việc sử dụng các hàm gọi lại lồng nhau có thể khiến mã trở nên lộn xộn và khó bảo trì hơn.
  • Hầu hết các vấn đề với các hàm gọi lại lồng nhau có thể được giảm thiểu bằng cách sử dụng các lời hứa và trình tạo trong Node.js
  • Lời hứa là giá trị được trả về bởi một hàm bất đồng bộ để chỉ ra sự hoàn tất của quá trình xử lý được thực hiện bởi hàm bất đồng bộ.
  • Các lời hứa có thể được lồng vào nhau để làm cho mã trông đẹp hơn và dễ bảo trì hơn khi một hàm bất đồng bộ cần được gọi sau một hàm bất đồng bộ khác