Trong bài tập trước,
chúng tôi đã học được về hai khía cạnh mới của JavaScript,
hỗ trợ các chức năng hạng nhất và đóng cửa.
Chúng tôi cũng thấy cách Node xử lý khía cạnh lập trình không đồng bộ và cách Node
hỗ trợ thực thi mã không đồng
bộ với việc sử dụng callbacks và cũng xử lý lỗi.
Hãy xem một ví dụ về cách chúng tôi sử dụng điều này
trong ứng dụng Node của chúng tôi trong bài tập này.
Tiếp tục với nơi chúng tôi rời khỏi trong bài tập trước,
bây giờ tôi sẽ đi và sửa đổi các mô-đun Node hình chữ nhật,
để nó có thể mất sự giúp đỡ của callbacks.
Vì vậy, tôi sẽ loại bỏ các xuất khẩu ở đây,
và thay vào đó, họ sẽ sửa đổi chức năng này.
Tôi sẽ sử dụng hai chức năng này một chút sau đó,
vì vậy đó là lý do tại sao tôi lưu chúng ở phía dưới.
Vì vậy, hãy để tôi giữ chúng sang một bên.
Và sau đó tôi sẽ sửa đổi mô-đun hình chữ nhật này như sau.
Vì vậy, chúng tôi sẽ nói module.exports.
Vì vậy, chúng tôi đang sử dụng cách tiêu chuẩn mô-đun được xử lý.
Và điều này sẽ xuất khẩu chức năng này trong đó có ba tham số,
x và y và callback.
Các callback là một chức năng mà sẽ được cung cấp trong khi mô-đun này được gọi.
Vì vậy, đây là việc sử dụng các chức năng lớp đầu tiên mà chúng ta đã nói về trước đó.
Vì vậy, bên trong callback này,
vì vậy bạn có thể thấy rằng bạn đang nhận được hai tham số, x và y
Trong trường hợp này, cho hình chữ nhật,
x và y tương ứng với chiều dài và chiều rộng
của hình chữ nhật đang được thông qua như là hai giá trị.
Vì vậy, bên trong đây, chúng ta sẽ kiểm tra để xem
nếu x là nhỏ hơn hoặc bằng 0 hoặc y là nhỏ hơn hoặc bằng 0.
Chúng tôi đã viết mã như thế này ở đây.
Vì vậy, tôi sẽ chỉ sao chép mã này từ đây
và sau đó mang nó qua đây và sau đó chúng tôi sẽ chỉnh sửa.
Vì vậy trong trường hợp này, đây là nếu x nhỏ
hơn hoặc bằng 0 hoặc y nhỏ hơn hoặc bằng 0.
Trong trường hợp này, chúng ta phải làm gì?
Trong trường hợp này, chúng ta nhận thấy rằng
kích thước của hình chữ nhật nhỏ hơn hoặc bằng không.
Vì vậy, chúng ta phải xử lý nó một cách khác nhau,
và chúng ta sẽ làm một phần khác của nó.
Phần khác nơi chúng tôi xử lý tình huống mà hình chữ nhật là một hình chữ nhật hợp lệ.
Vì vậy, trong trường hợp này,
những gì chúng tôi sẽ làm là sau đó sử dụng một setTimeout.
Vì vậy, ở đây, tôi đang mô phỏng một thực tế rằng bất cứ điều gì
đang được thực hiện trong hình chữ nhật này sẽ mất một thời gian.
Vì vậy, đây là quá trình xử lý không đồng bộ.
Bây giờ, kể từ khi tôi không có rất nhiều công việc để làm trong nền,
vì vậy tôi sẽ mô phỏng điều đó bằng cách sử dụng
hàm SetTimeout của JavaScript và sau đó
trì hoãn trước khi hàm callback được gọi.
Vì vậy, cách tôi sắp xếp điều này là như sau.
Vì vậy, bên trong setTimeout,
tôi sẽ gọi chức năng này ở đó
và sắp xếp một sự chậm trễ của
2.000 mili giây hoặc hai giây sau đó chức năng này sẽ được gọi.
Vì vậy, nếu bạn nhớ lại,
setTimeout được hỗ trợ trong JavaScript,
nó mất như là tham số đầu tiên một chức năng và
tham số thứ hai sẽ là khoảng thời gian mà điều này sẽ bị trì hoãn.
Vì vậy, để tôi thụt lề này vào.
Bây giờ, tôi cần phải điền vào chức năng này ở đây.
Vì vậy, tôi đã bắt đầu với các chức năng mũi tên ở đây
mà không mất tham số và sau đó khi có được gọi,
tôi sẽ phát hành một cuộc gọi để gọi lại.
Gọi lại này là một hàm callback
sẽ được thông qua như là tham số thứ ba ở đây.
Chức năng gọi lại này, như bạn nhận thấy, có hai tham số.
Cái đầu tiên là lỗi và cái thứ hai là giá trị trả về.
Vì vậy, trong trường hợp này, kể từ khi chúng ta có một lỗi,
bởi vì x là nhỏ hơn hoặc bằng 0 và y là nhỏ hơn hoặc bằng 0, vì
vậy giá trị đầu tiên tôi sẽ vượt qua như là lỗi mới,
và lỗi này là chính xác chuỗi này mà tôi đã sử dụng trong console.log sau đó,
và đó là những gì tôi sẽ vượt qua như lỗi ở đây.
Bây giờ hãy để tôi xóa console.log đó,
tôi không còn cần nó nữa.
Vì vậy, cho callback,
tôi sẽ tạo ra một đối tượng lỗi mới và sau đó vượt qua điều này
như là giá trị trả về cho hàm callback, tham số đầu tiên.
Vì vậy, tôi sẽ nói kích thước hình chữ nhật nên lớn hơn 0.
Vì vậy, chúng tôi sẽ nói l,
đây là x và giá trị y mà chúng tôi nhận được như là các giá trị đầu vào đó.
Vì vậy, đó là cuộc gọi lại.
Và phần thứ hai của cuộc gọi lại này,
tôi sẽ vượt qua như null bởi vì điều này sẽ trả về một lỗi.
Vì vậy, khi bạn trả về một lỗi như là tham số đầu tiên,
tham số thứ hai sẽ bị bỏ qua khi callback đó chỉ nhận được bởi
các mô-đun nút từ nơi chúng tôi đang gọi chức năng đặc biệt này ở đó.
Vì vậy, với sự sắp xếp này,
rất ít hơn 0,
vì vậy hãy để tôi cho một số không gian ở đây để nó được thụt lề đúng cách ở đây.
Vì vậy, cách tôi sắp xếp này
ở đây là nếu x nhỏ hơn 0 và y nhỏ hơn 0,
tôi sẽ gọi lại chức năng gọi lại đã được thông qua,
nhưng tham số đầu tiên sẽ vượt qua trong
lỗi vì ở đây chúng tôi nhận thấy rằng có một lỗi,
và tham số thứ hai sẽ là null.
Nếu đây không phải là trường hợp,
sau đó tôi sẽ gọi cùng một cuộc gọi lại,
nhưng với tham số đầu tiên.
Vậy hãy để tôi sao chép đoạn mã đó ở đây.
Tôi vẫn sẽ sử dụng SetTimeout ở đây.
Nhưng phần đầu tiên đó sẽ không phải là một lỗi,
thay vào đó, phần đầu tiên,
trong trường hợp này, không có lỗi.
Vì vậy, tôi chỉ đi để vượt qua giá trị đó là null.
Vì vậy, điều đó có nghĩa là lỗi được đặt thành null.
Vì vậy, đây là một hình chữ nhật hợp lệ.
Vì vậy, chúng ta có thể tính toán các giá trị cho hình chữ nhật.
Nhưng thay vào đó, tôi sẽ chỉ đơn giản là vượt qua trong
một đối tượng JavaScript chứa hai chức năng
như hai giá trị bên trong đối tượng JavaScript này.
Vì vậy, ở đây tôi sẽ lấy hai,
chu vi và diện tích,
và sau đó hai sẽ được thông qua như hai giá trị ở đây,
chu vi và diện tích.
Và hai, kể từ khi chúng xảy ra là một đối tượng JavaScript,
vì vậy chu vi và diện tích sẽ là
hai thuộc tính mà tôi sẽ vượt qua bên trong các đối tượng JavaScript,
và đó là nó.
Vì vậy, ở đây, trong trường hợp thứ hai,
lỗi được thiết lập để null vì không có lỗi,
nhưng phần thứ hai,
nhận thấy rằng tôi đang đi qua trong một đối tượng JavaScript chứa hai thuộc tính,
chu vi và diện tích, đó là hai chức năng ở đây.
Vì vậy, hai hàm là hàm chu vi và hàm diện tích.
Vì vậy, đối tượng JavaScript này sẽ được thông qua trở lại như là
giá trị trả về cho các callback ở đây, giá trị thứ hai.
Và một lần nữa, tôi sẽ trì hoãn điều này bằng
một khoảng thời gian hai thứ hai trước khi giá trị sẽ được truyền lại bởi chức năng này.
Lý do tại sao tôi đang sử dụng setTimeout là để mô phỏng
một sự chậm trễ trước khi gọi lại đến từ phía bên kia.
Vì vậy, loại này đại diện cho các tình huống mà, ví dụ,
bạn phát hành một cuộc gọi cơ sở dữ liệu đến cơ sở
dữ liệu, và cơ sở dữ liệu cần phải được đọc trước khi giá trị được truyền lại cho bạn.
Vì vậy, điều đó sẽ mất một khoảng thời gian nhất định.
Vì vậy, tôi về cơ bản mô phỏng này tại thời điểm này bằng cách sử dụng chức năng SetTimeout ở đây.
Sau đó, bạn sẽ thấy rằng khi chúng ta tích hợp MongoDB với
Express của chúng tôi trong các bài tập sau,
sự chậm trễ đó sẽ phải được mô phỏng,
nó sẽ được tự động gây ra bởi vì thực tế là bạn cần phải thực hiện các
hoạt động cơ sở dữ liệu đằng sau hậu trường trước khi dữ liệu được thu thập.
Vì vậy, ở đây, sau khi hoàn thành cập nhật mô-đun hình chữ nhật này,
vì vậy ở đây bạn thấy rằng các mô-đun hình chữ nhật mất trong
ba tham số vì nó là một cuộc gọi đầu vào đây
, x, y và gọi lại.
Và như vậy, callback là hàm callback đang được cung cấp ở đây.
Và hàm callback này sẽ được gọi bên trong ở đây,
và khi hàm callback được gọi,
hoặc là bạn vượt qua một lỗi hoặc bạn vượt qua trở lại
một hàm cho phép bạn tính toán chu vi và diện tích của hình chữ nhật.
Bây giờ, mô hình này gọi vào và đi vào một hàm callback
từ một module Node và sau đó là module Node thứ hai mà khi nó hoàn thành,
sẽ truyền lại kết quả bằng cách sử dụng hàm callback
chính xác là mẫu mà bạn sẽ thấy thường lặp lại trong các ứng dụng Node.
Vì vậy, đó là lý do tại sao tôi minh họa nó.
Tất nhiên, đây là một ví dụ giả định mà tôi đang minh họa ở đây nhưng nó cho thấy
tất cả các mẫu tiêu chuẩn mà bạn sẽ sử dụng với các
chức năng nút và callback và cũng là xử lý lỗi.
Bây giờ, chúng tôi đã cập nhật mô-đun hình chữ nhật ở đây.
Chúng ta hãy đi và sửa chữa tập tin index.js để nó có thể vượt qua trong hàm callback và
sau đó xử lý giá trị trả về được gửi trở lại từ mô-đun hình chữ nhật.
Chuyển đổi trở lại index.js,
bây giờ chúng ta sẽ cập nhật các tập tin index.js như sau.
Tôi sẽ loại bỏ điều này từ các tập tin index.js thay vào đó.
Ở đây, những gì chúng tôi sẽ kết thúc làm là gọi
mô-đun hình chữ nhật này và
sau đó vượt qua trong l và b như hai tham số.
Và tham số thứ ba mà tôi sẽ vượt qua là hàm callback.
Vì vậy hàm callback có hai tham số, err và hình chữ nhật.
Và chức năng gọi lại này được thực hiện như sau đây.
Vì vậy, ở đây, bạn thấy rằng tôi đang gọi
mô-đun nút hình chữ nhật này và tôi đang
đi qua chiều dài và chiều rộng của hai tham số đầu tiên.
Và tham số thứ ba là, tất nhiên,
một chức năng gọi lại mà tôi đang thực hiện ở đây.
Vì vậy, đây là một chức năng mũi tên mà tôi đang thực hiện ở đây.
Vì vậy, bên trong chức năng callback này,
làm thế nào để tôi xử lý giá trị trả về?
Vì vậy, ở đây tôi sẽ nói nếu (err),
vì vậy nếu giá trị lỗi được trả lại cho bạn,
sau đó tôi sẽ chỉ đơn giản là làm console.log và tôi sẽ nói
“ERROR” và sau đó giá trị thứ hai là err.message.
Nhớ lại rằng trong hình chữ nhật,
chúng tôi đã tạo ra đối tượng lỗi mới này
và sau đó thông qua trong chuỗi này bên trong đối tượng lỗi này.
Chuỗi này sẽ được gắn
vào đối tượng lỗi vào thuộc tính thư của đối tượng lỗi ở đây.
Vì vậy, trong tập tin index.js,
vì vậy tôi lấy tài sản tin nhắn của đối tượng lỗi
và sau đó in nó ra trên giao diện điều khiển của tôi ở đây.
Vì vậy, nếu một lỗi xảy ra,
tôi sẽ in ra các thông báo lỗi bằng cách sử dụng này.
Và như vậy, đây là cách tôi sẽ xử lý lỗi đã được trả về bởi một hàm callback.
Nếu không, tất nhiên trong trường hợp này,
mô-đun hình chữ nhật đã trả về hàm hình chữ nhật,
đối tượng có chứa chu vi và các chức năng khu vực,
vì vậy tôi có thể đi trước và in ra giá trị đó.
Vì vậy, ở đây, tôi sẽ nói diện tích
của hình chữ nhật có kích thước l bằng,
vì vậy tôi sẽ nói,
và b bằng.
Lý do tại sao tôi xác định nó một cách rõ
ràng sẽ trở nên rất rõ ràng khi chúng ta chạy ví dụ này.
Tôi sẽ nói là hình chữ nhật.
Bây giờ, lưu ý rằng đối với khu vực này,
tôi không gửi bất kỳ tham số nào ở đây bởi vì đi đến giá trị,
chiều dài và hơi thở đã được thông qua ở đây trong l và b,
và những người sẽ có sẵn cho điều này
và ở đây vì đóng cửa mà JavaScript hỗ trợ.
Bởi vì các x và y đã đi vào như các tham số, vì
vậy những người sẽ có thể truy cập ngay ở đó trong chức năng gọi lại này.
Vì vậy, những x_y sẽ được tự động có sẵn cho chúng tôi ở đây.
Vì vậy, như một vấn đề của thực tế,
tôi không cần phải cung cấp các tham số x và y ở đây ở tất cả bởi vì
những x và y sẽ được lấy ra từ x này và y ngay tại đó.
Vì vậy, tôi thậm chí không cần phải vượt qua hai giá trị đó trong đây.
Vì vậy, đó là lý do tại sao, ngay tại đó,
tôi có thể gọi hình chữ nhật.
Và tính toán khu vực này sẽ tự động nhận được l và b đã được thông qua
bởi các cuộc gọi hình chữ nhật để trực tiếp mô-đun nút trước đó.
Vì vậy, đây là sự đóng cửa của JavaScript hoạt động ở đây.
Vì vậy, đó là lần đầu tiên.
Tôi đang in ra khu vực của hình chữ nhật.
Điều tương tự, hãy để tôi in ra các chu vi.
Vì vậy, để in ra các perimeters,
vì vậy tôi sẽ nói console.log.
Chu vi của hình chữ nhật sẽ là chu vi hình chữ nhật.
Bây giờ, tôi phải nói với bạn rằng cách tiếp cận này để thực hiện cần một chút
nỗ lực để hiểu và nội bộ hóa khả năng chức năng không đồng bộ.
Phải mất một thời gian để bạn hoàn toàn hiểu nó thực sự hoạt động như thế nào.
Bây giờ để minh họa thực tế rằng
cuộc gọi hàm này sẽ dẫn đến một cuộc gọi đến mô-đun Node
nhưng phần này sẽ được thực hiện chỉ sau
một sự chậm trễ hai giây vì thực tế là chúng ta đang sử dụng dấu thời gian thiết lập.
Bây giờ, như chúng tôi đã nghiên cứu trong hoạt động không đồng bộ,
bởi vì chúng tôi đã di chuyển ra phía sau xử lý,
hãy để tôi cũng giới thiệu thêm một console.log ở đây để làm cho một điểm.
Vì vậy, chúng tôi sẽ nói tuyên bố này là
sau khi cuộc gọi đến rect.
Lý do tại sao tôi minh họa điểm này là khi bạn phát hành cuộc gọi này,
mã này sẽ không được thực hiện cho đến sau một sự chậm trễ hai giây.
Vì vậy, trong khi chờ đợi,
chức năng của bạn, chức năng chính ở đây,
sẽ tiếp tục và sau đó thực hiện dòng tiếp theo của mã mà bạn thấy ở đây.
Vì vậy, đây là sự tiếp nối mà bạn sẽ thấy ở đây.
Vì vậy, với những thay đổi này,
chúng ta hãy lưu các thay đổi và sau đó nhìn vào cách ứng dụng này thực hiện ngay bây giờ.
Vì vậy, lưu lại những thay đổi.
Hãy đi đến thiết bị đầu cuối và thực hiện ứng dụng nút này.
Bây giờ, đi đến thiết bị đầu cuối, thêm dấu nhắc.
Hãy để tôi gõ npm bắt đầu và bạn sẽ ngay lập tức nhận thấy
rằng giải quyết và tuyên bố này đã được in ra trước đó.
Và sau đó sau sự chậm trễ nhất định này,
khu vực và chu vi đã được in ra.
Vì vậy, đó là một sự chậm trễ hai giây mà chúng tôi giới thiệu bằng cách sử dụng thời gian ra.
Vì vậy, bạn nhận thấy rằng trong phiên bản trước đó,
điều này đã được in và ngay lập tức khu vực và chu vi đã được in ngay dưới đó.
Nhưng bây giờ, chú ý rằng những giá trị này được in ra một chút sau đó.
Vì vậy, ở giữa, chức năng của họ gọi với các tham số khác nhau đã được đi
vào và sau đó các callbacks được gọi trở lại sau hai lần chậm trễ cho mỗi một trong số họ.
Và vì thực tế là có sự đóng cửa mà JavaScript hỗ trợ,
vì vậy các giá trị được thông qua được bảo tồn.
Và vì vậy khi hàm gọi lại được gọi,
giá trị thích hợp được in.
Vì vậy, đó là lý do tại sao bạn thấy rằng khu vực và
chu vi được in chính xác và hai ở
đây, hai báo cáo ở đây,
tương ứng với cuộc gọi đặc biệt này
để trực tiếp với l là bằng hai và b là bằng bốn.
Và sau đó hai,
kế tiếp hai, tất nhiên,
tương ứng với cái đặc biệt này và những cái còn lại như bạn thấy ở đây.
Vì vậy, những gì tôi muốn minh họa là một thực tế rằng khi bạn thực hiện tính toán không đồng bộ, tính toán không
đồng bộ mất thời gian riêng của mình
để trả về giá trị trong khi tính toán chính của bạn
sẽ tiến hành về phía trước mà không cần chờ đợi cho callback được hoàn thành.
Vì vậy, khi bạn cần phải làm một số lượng công việc nhất định,
bạn đã chuyển vào như một callback cho mô-đun khác đó.
Và khi mô-đun khác hoàn thành công việc của nó,
nó sẽ gọi lại và sau đó mã đó sẽ được thực hiện.
Vì vậy, đó là điểm mà tôi đã minh họa bằng cách sử dụng ví dụ này. Một
lần nữa, như tôi đã nói,
điều này cần một chút trí tưởng tượng và sự hiểu biết
để bạn nội bộ hóa cách thức hoạt động này,
nhưng bạn sẽ thấy rằng với Node và cũng Express và khi chúng tôi sử dụng MongoDB,
bạn sẽ thấy kiểu mẫu này lặp đi lặp lại rất thường xuyên trong cách chúng tôi viết mã của chúng tôi.
Vì vậy, với minh họa đơn giản này của callbacks và xử lý lỗi,
chúng tôi hoàn thành bài tập này.
Đây là thời điểm tốt cho bạn để làm một nhận xét get với thông điệp đó,
nút, callbacks, và xử lý lỗi.