Hướng dẫn về Node.js Promise

Trong các hướng dẫn trước, bạn sẽ 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 trở nên lồng vào nhau và chương trình bắt đầu trở nên dài và phức tạp.

Trong hướng dẫn này, bạn sẽ học-

  • Lời hứa là gì?
  • Gọi lại những lời hứa
  • Đối phó với những lời hứa lồng ghép
  • Tạo một lời hứa tùy chỉnh

Lời hứa là gì?

Trước khi bắt đầu với các 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. 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 chúng ta hãy nhanh chóng đi qua một trong số chúng.

Ví dụ dưới đây cho thấy một đoạn mã, được sử dụng để kết nối với cơ sở dữ liệu MongoDB 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.

  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 một hàm ẩn danh hoặc hàm gọi lại. Khi MongoClient tạo kết nối đến cơ sở dữ liệu MongoDB, nó sẽ quay trở lại chức năng gọi lại sau khi hoàn tất hoạt động kết nối. Vì vậy, theo một nghĩa nào đó, các hoạt động kết nối xảy ra trong nền và khi nó được thực hiện, 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 quan trọng 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 cơ sở dữ liệu MongoDB của chúng tôi.

Vậy một lời hứa sau đó là gì? Chà, một lời hứa chỉ là một sự 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ó một trường hợp mà 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. Nói tóm lại, một lời hứa là một sự tăng cường 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 không đồ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ề gọi là "lời hứa".
  • Khi một lời hứa được trả lại, nó có thể có 2 đầu ra. Điều này được định nghĩa bởi 'mệnh đề then'. Hoạt động 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 bình thường trong Node.js. Do giá trị trả về, chúng tôi có nhiều quyền kiểm soát hơn về cách hàm gọi lại có thể được xác định.

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

Gọi lại những lời hứa

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

Sau đó, chúng tôi sẽ sửa đổi mã của mình như được hiển thị bên dưới, mã này 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 các lời hứa.

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

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

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

Bước 2) Sửa đổi mã để bao gồm các 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 là bao gồm mô-đun 'hứa hẹn' sẽ cho phép chúng tôi sử dụng chức năng hứa hẹn trong mã của chúng tôi.
  2. Bây giờ chúng ta có thể thêm hàm 'then' vào hàm MongoClient.connect của chúng ta. Vì vậy, điều này làm 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 EmployeeName của nhân viên có tên "Martin" thành "Mohan".

Ghi chú:-

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

Để kiểm tra xem dữ liệu đã được chèn đúng cách 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 EmployeeDB
  2. db.EFastee.find ({EmployeeName: 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 EmployeeDb. Câu lệnh thứ hai tìm kiếm bản ghi có tên nhân viên là "Mohan".

Đối phó với những lời hứa lồng ghép

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

Trong ví dụ dưới đây, 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 cơ sở dữ liệu MongoDB.

( Lưu ý : 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 được gọi là 'methodA' và 'methodB.' Và logic là 'methodB' phải được gọi sau 'methodA', thì 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à có thể bảo trì bằng cách sử dụng 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 xác định 2 mệnh đề "then" được thực thi lần lượt. Trong mệnh đề then đầu tiên, chúng ta đang chuyể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 đang sử dụng thuộc tính bộ sưu tập của kết nối 'db' để chèn các 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 vào bộ sưu tập Nhân viên.
  2. Sau đó, chúng ta cũng đang sử dụng mệnh đề then 2 để 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 cơ sở dữ liệu MongoDB, bạn sẽ thấy bản ghi 2 được chèn vào cơ sở dữ liệu MongoDB.

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

Một lời hứa tùy chỉnh có thể được tạo bằng cách sử dụng mô-đun nút có tên là '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 "dedeify" có thể được gọi để làm cho bất kỳ hàm nào trở thành một hàm trả về một lời hứa.

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

Khi điều đó được thực hiện, chúng tôi sẽ sử dụng lời hứa được trả về bởi chức năng Thêm để hiển thị một thông báo trong console.log.

Hãy làm theo các bước dưới đây để tạo hàm tùy chỉnh của chúng tôi để trả về một 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, mô-đun 'q' là bắt buộc. Để cài đặt mô-đun 'q', hãy chạy lệnh dưới đây

npm cài đặt q

Bước 2) Xác định mã sau đây sẽ được sử dụng để tạo 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 request. Bằng cách sử dụng thư viện này, chúng tôi sẽ có thể xác định bất kỳ hàm nào để trả về một cuộc gọi lại.
  2. Chúng tôi đang tạo một hàm có tên là Add, hàm này sẽ thêm 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 tôi đang sử dụng thư viện q để chỉ định (phương pháp được sử dụng để chuyển đổi bất kỳ hàm nào thành một hàm sẽ trả về một lời hứa) hàm Add của chúng tôi hoặc bằng cách khác chuyển đổi hàm Add của chúng tôi thành một hàm trả về một lời hứa.
  4. Bây giờ chúng ta gọi hàm "Thêm" của mình và có thể nhận được giá trị hứa hẹn trả về do bước trước chúng ta đã thực hiện là xác định hàm Thêm.
  5. Từ khóa 'then' được sử dụng chỉ định rằng nếu hàm được thực thi thành công thì 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, kết quả đầu ra "Chức năng bổ sung đã hoàn thành" sẽ được hiển thị trong console.log như hình dưới đây.

Tóm lược

  • Sử dụng các hàm gọi lại trong Node.js có nhược điểm của nó. Đôi khi trong quá trình phát triển, việc sử dụng lồng nhau các hàm gọi lại có thể làm cho mã trở nên lộn xộn và khó bảo trì.
  • 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 với việc sử dụng các hứa hẹn và trình tạo trong node.js
  • Lời hứa là một giá trị được trả về bởi một hàm không đồng bộ để cho biết việc hoàn thành quá trình được thực hiện bởi hàm không đồ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 không đồng bộ cần được gọi sau một hàm không đồng bộ khác

thú vị bài viết...