Trong bài giảng này và bài tập sau,
chúng ta sẽ nói cụ thể về Callback Hell.
Vấn đề phát sinh khi bạn viết
callbacks trong nút và đặc biệt là lồng nhau callbacks và node.
Chúng ta cũng sẽ xem xét những lời hứa như một cách để giải quyết vấn đề Callback Hell.
Để cung cấp cho bạn một ý tưởng về những gì các vấn đề Callback Hell điển hình sẽ dẫn
đến, hãy xem lại các tập tin index.js từ bài tập trước đó.
Như tôi đã nói về nó trong bài tập trước,
bạn nhận thấy rằng đối với mỗi hoạt động mà chúng tôi thực hiện, các
hoạt động tiếp theo được bao gồm bên trong chức năng gọi lại ở đây
và như vậy cho đến khi bạn tạo thành một kim tự tháp như cấu trúc đi một lần nữa.
Vì vậy, bạn thấy kim tự tháp này giống như cấu trúc phát sinh trong mã của bạn.
Bây giờ hãy tưởng tượng rằng bạn cần phải thực hiện nhiều hoạt động lồng nhau như thế này,
mã của bạn sẽ trở nên khá sớm
, rất phức tạp, và không dễ dàng để giải mã.
Bây giờ đây là những gì trong thế giới node.js,
họ đề cập đến như là Callback Hell.
Đã có một số cách để giảm nhẹ vấn đề phát sinh.
Bây giờ bạn hoàn toàn có thể tránh được điều này vì thực
tế là bạn có
một số thao tác cần phải hoàn thành trước khi thao tác tiếp theo có thể được bắt đầu, nhưng chúng ta có thể sắp xếp lại mã theo cách để giảm thiểu vấn đề này.
Hứa hẹn là một cách để giải quyết vấn đề này.
Vì vậy, để tóm tắt những gì chúng tôi vừa thảo luận,
nhiều lồng nhau mã callback,
gây ra vấn đề Callback Hell và nó
kết quả từ xu hướng của chúng tôi để viết các chương trình từ trên xuống.
Chúng tôi vẫn còn treo lên với cách viết mã tuần tự của chúng tôi và
vì vậy chúng tôi thấy nó thuận tiện hơn để viết mã từ trên xuống dưới,
và nhìn vào nó như thể nó đang thực hiện theo thứ tự đó.
Bây giờ chúng ta có thể làm việc xung quanh vấn đề Callback Hell bằng cách
không sử dụng hàm ẩn danh cho các callbacks mà thay vào
đó, khai báo
các hàm đó với tên cụ thể, và sau đó tránh cách chúng ta viết mã như bạn thấy ở đây.
Đó là một trong những cách tiếp cận mà mọi người thực hiện để đối phó với vấn đề Callback Hell.
Có một số cách tiếp cận khác đã được đề xuất,
liên kết đến một vài bài viết về vấn đề này được cung cấp trong các tài nguyên bổ sung.
Nhưng trong bài giảng đặc biệt này,
tôi sẽ tập trung vào một cách tiếp cận cụ thể
được sử dụng để giải quyết vấn đề Callback Hell,
đó là việc sử dụng các lời hứa.
Vì vậy, chúng ta có thể sử dụng lời hứa để chế ngự bài toán Callback Hell ở một mức độ khá lớn.
Chúng tôi sẽ xem xét cách hứa hẹn giúp chúng tôi trong vấn đề này và trong
bài tập chúng tôi sẽ thấy như thế nào bởi vì trình điều khiển NODE-MONGO DB đã
hỗ trợ một giao diện proxy, chúng tôi có thể tận dụng nó để viết lại mã của chúng tôi
để tận dụng lợi thế của lời hứa hỗ trợ trong trình điều khiển MONGO DB.
Tóm tắt ngắn gọn những gì một lời hứa là.
Một lời hứa là một cơ chế hỗ trợ tính toán không đồng bộ.
Vì vậy, nếu bạn có số lượng công việc cần phải được thực hiện,
lời hứa đóng vai trò như một proxy cho một giá trị mà
không được biết đến tại thời điểm này nhưng lời hứa được trao cho bạn.
Nhưng khi giá trị trở nên có sẵn,
nó sẽ có sẵn trong tương lai.
Vì vậy, lời hứa đại diện cho một giữ chỗ cho giá trị đó.
Nếu giá trị kết quả chính xác,
sau đó lời hứa của bạn kết quả chính xác và bạn có thể có
một đoạn mã thực thi để xử lý thực tế là lời hứa được giải quyết một cách chính xác,
nếu không thì bạn xử lý lỗi trong tình huống đó.
Vì vậy, một lời hứa sẽ giải quyết hoặc là quyết tâm hoặc từ chối lời hứa.
Một lời hứa đang chờ xử lý có thể giải quyết
khi giá trị được thu được một cách chính xác như vậy trong trường hợp đó,
nó sẽ giải quyết hoặc những gì chúng tôi gọi là hoàn thành lời hứa.
Vì vậy, khi lời hứa được giải quyết,
sau đó bạn sẽ có một đoạn mã
xử lý thực tế là lời hứa đã được giải quyết.
Nếu lời hứa bị từ chối,
bạn cũng nên xử lý tình huống đó
từ chối lời hứa tương ứng trong mã của bạn.
Vì vậy, đó là lý do bất cứ khi nào bạn tạo ra một lời hứa,
bạn chỉ cung cấp quyết tâm và các lựa chọn từ chối từ nó.
Các tùy chọn giải quyết thường được xử lý bởi bác sĩ sau đó lựa chọn cho lời hứa của bạn.
Vậy tại sao chúng ta lại sử dụng lời hứa?
Lời hứa được sử dụng bởi vì nó
giải quyết vấn đề địa ngục gọi lại đến một mức độ lớn và lời hứa có thể được thay đổi.
Ví dụ, nếu bạn có một lời hứa mà
lần lượt kích hoạt một cuộc gọi đến một lời hứa khác mà sẽ trả lại một lời hứa.
Việc xử lý lời hứa có thể được thay đổi thành tay cầm của lời hứa trước đó.
Vì vậy, bạn có thể có một loạt các,
sau đó các cuộc gọi sẽ xử lý sự trở lại của giá trị.
Bây giờ chúng ta sẽ thấy việc sử dụng điều này trong bài tập sau bài giảng này.
Để tiêu thụ một lời hứa,
bạn sẽ đăng ký
một chức năng gọi lại thích hợp cho khi người tiêu dùng
của một lời hứa được thông báo hoặc từ chối lời hứa.
Vì vậy, các callbacks được đăng ký thông qua .then () để promise.
Bạn sẽ sử dụng .catch () để bắt các lỗi trong lời hứa trả về.
Bây giờ các phương pháp .then () có thể được xích lại
với nhau như bạn sẽ thấy trong bài tập sau.
Ví dụ, bạn thường sẽ xử lý một lời hứa bằng cách
xăng.then () và .catch () vào giá trị lời hứa.