Nodejs readline async đang chờ

Xử lý không đồng bộ là một trong những khía cạnh quan trọng nhất của ngôn ngữ JavaScript. JavaScript là ngôn ngữ đơn luồng, do đó, nó cần một cơ chế để xử lý các hành động như thực hiện các hoạt động tốn nhiều thời gian và có khả năng không đáng tin cậy như thực hiện lệnh gọi API REST, đọc tệp từ đĩa hoặc tương tác với đầu vào của người dùng

Trong JavaScript, cơ chế được sử dụng là , xử lý hàng đợi gọi lại theo thứ tự từ mục cũ nhất đến mục mới nhất. Mỗi mục trong hàng đợi là một tin nhắn được xử lý hoàn chỉnh trước khi chuyển sang tin nhắn tiếp theo tiếp theo. Mỗi thông báo là một chức năng trả về phản hồi cho mã ở nơi khác trong ứng dụng. Các chức năng được sử dụng theo cách này được gọi là chức năng gọi lại

Do các cuộc gọi lại, JavaScript có thể sử dụng một số kỹ thuật để khắc phục tính chất đơn luồng của nó để thực hiện xử lý không đồng bộ. Thật không may, một số kỹ thuật đó, Lời hứa JavaScript và RxJS Observables, buộc bạn phải giới thiệu ít nhất một cấp độ lồng nhau trong mã của mình. Điều đó làm cho mã khó đọc và khó bảo trì hơn

May mắn thay, các phiên bản JavaScript gần đây đi kèm với một kỹ thuật bổ sung để làm việc với mã không đồng bộ. không đồng bộ và chờ đợi. Đó là một lựa chọn hoàn hảo khi bạn muốn chương trình của mình chặn đồng bộ trong khi một số hành động không đồng bộ được thực hiện, sau đó tiếp tục hoạt động sau khi hành động đó kết thúc

Bài đăng này sẽ giới thiệu cho bạn các nguyên tắc cơ bản của async và await và cho bạn thấy các ví dụ cụ thể. Sau đó, bạn sẽ có cơ hội tạo một ứng dụng trong thế giới thực sử dụng async và đang chờ để thực hiện xử lý không đồng bộ

Hiểu JavaScript không đồng bộ trước khi không đồng bộ và chờ đợi

Trước khi bắt đầu với không đồng bộ và chờ đợi, thật hữu ích khi hiểu về các cuộc gọi lại, đây là một phần nền tảng của tất cả quá trình xử lý không đồng bộ JavaScript. Điều quan trọng là phải hiểu về Promise, thứ bổ sung khả năng cho vòng lặp sự kiện và quy trình gọi lại. Lời hứa được sử dụng phối hợp chặt chẽ với chức năng không đồng bộ và chờ đợi

gọi lại

Gọi lại là kỹ thuật cơ bản nhất, lâu đời nhất để chạy mã JavaScript không đồng bộ. Gọi lại là “một chức năng được truyền vào một chức năng khác dưới dạng đối số, sau đó được gọi bên trong chức năng bên ngoài để hoàn thành một số loại quy trình hoặc hành động. ” (MDN)

Các cuộc gọi lại có một nhược điểm đáng kể khi chúng chạy đồng bộ. chúng chặn vòng lặp sự kiện cho đến khi chúng kết thúc và do đó có thể khiến các chương trình trở nên không phản hồi và xuất hiện trạng thái "đông cứng". Bạn có thể xem một ví dụ về điều này trong các hàm sử dụng thư viện yêu cầu đồng bộ hóa, thực thi đồng bộ

Bạn có thể viết một hàm sử dụng gọi lại theo cách sau

Hàm

mkdir async-await
cd async-await
git init
npx license mit > LICENSE
npx gitignore node
npm init -y
git add -A
git commit -m "Initial commit"
npm install esm
0 có tham số
mkdir async-await
cd async-await
git init
npx license mit > LICENSE
npx gitignore node
npm init -y
git add -A
git commit -m "Initial commit"
npm install esm
1, là một chuỗi chứa URL mà bạn muốn thực hiện yêu cầu HTTP và nhận mã trạng thái từ phản hồi. Tham số thứ hai là
mkdir async-await
cd async-await
git init
npx license mit > LICENSE
npx gitignore node
npm init -y
git add -A
git commit -m "Initial commit"
npm install esm
2, đây là một chức năng sẽ được thực thi sau khi mã trạng thái được truy xuất

Hàm sử dụng API để đưa lệnh gọi

mkdir async-await
cd async-await
git init
npx license mit > LICENSE
npx gitignore node
npm init -y
git add -A
git commit -m "Initial commit"
npm install esm
3 và lệnh gọi hàm
mkdir async-await
cd async-await
git init
npx license mit > LICENSE
npx gitignore node
npm init -y
git add -A
git commit -m "Initial commit"
npm install esm
2 vào hàng đợi gọi lại sau thời gian được chỉ định làm tham số thứ hai của
mkdir async-await
cd async-await
git init
npx license mit > LICENSE
npx gitignore node
npm init -y
git add -A
git commit -m "Initial commit"
npm install esm
5. Bởi vì
mkdir async-await
cd async-await
git init
npx license mit > LICENSE
npx gitignore node
npm init -y
git add -A
git commit -m "Initial commit"
npm install esm
5 không đồng bộ, thân hàm
mkdir async-await
cd async-await
git init
npx license mit > LICENSE
npx gitignore node
npm init -y
git add -A
git commit -m "Initial commit"
npm install esm
0 được thực thi không đồng bộ và không chặn ngăn xếp JavaScript, được thực thi đồng bộ

lời hứa

Một cách khác để thực thi mã không đồng bộ trong JavaScript là sử dụng Lời hứa. Promise là một đối tượng cung cấp proxy cho một giá trị sẽ được xác định dựa trên kết quả, nếu có, của một hành động không đồng bộ sẽ xảy ra sau đó. Một Promise cũng có một trạng thái, cho biết trạng thái của hoạt động

Đoạn mã trên định nghĩa một hàm

mkdir async-await
cd async-await
git init
npx license mit > LICENSE
npx gitignore node
npm init -y
git add -A
git commit -m "Initial commit"
npm install esm
8 trả về một đối tượng Promise. Khi Lời hứa được trả về bởi hàm
mkdir async-await
cd async-await
git init
npx license mit > LICENSE
npx gitignore node
npm init -y
git add -A
git commit -m "Initial commit"
npm install esm
8 giải quyết, nó sẽ trả về mã phản hồi từ yêu cầu đến địa chỉ được chỉ định trong tham số
mkdir async-await
cd async-await
git init
npx license mit > LICENSE
npx gitignore node
npm init -y
git add -A
git commit -m "Initial commit"
npm install esm
1. Phương thức
npm install readline-promise
1 của đối tượng Promise chỉ định những việc cần làm khi lời hứa được giải quyết

Cả hai giải pháp đều tốt và tương đương nhau khi bạn muốn chạy một hành động không đồng bộ bằng cách sử dụng API bên ngoài như

mkdir async-await
cd async-await
git init
npx license mit > LICENSE
npx gitignore node
npm init -y
git add -A
git commit -m "Initial commit"
npm install esm
5,
npm install readline-promise
3 hoặc
npm install readline-promise
4. Thật không may, các giải pháp này không hoạt động tốt với các hành động không đồng bộ phụ thuộc vào các hành động khác, chẳng hạn như chờ người dùng nhập trước khi thực hiện một số logic có điều kiện dựa trên dữ liệu đã nhập

Ghi chú. Nếu bạn muốn tìm hiểu thêm về các cuộc gọi lại, Lời hứa, vòng lặp sự kiện hoặc các tính năng JavaScript không đồng bộ khác, hãy xem các bài đăng được liệt kê trong phần Tài nguyên bổ sung bên dưới. Chúng là một phần của thư viện hướng dẫn toàn diện về JavaScript không đồng bộ

Hiểu các từ khóa không đồng bộ và chờ đợi

Các từ khóa không đồng bộ và chờ đợi đã được thêm vào đặc tả JavaScript trong bản phát hành ECMAScript 2017, phiên bản thứ 8 của đặc tả. Đây là một cải tiến đáng kể về khả năng lập trình không đồng bộ của JavaScript và được các nhà phát triển ở khắp mọi nơi tôn vinh

Trong phiên bản thứ 9, ECMAScript 2018, một trình lặp không đồng bộ đã được giới thiệu. Tính năng mới này cho phép sử dụng từ khóa

npm install readline-promise
5 trong vòng lặp
npm install readline-promise
6

không đồng bộ

Từ khóa

npm install readline-promise
7 chỉ có thể được sử dụng với khai báo hàm. Nó cho biết môi trường thời gian chạy JavaScript (V8, Node. js hoặc Deno) rằng nó sẽ bọc thân hàm trong một Lời hứa. Lời hứa sẽ được trả về bởi hàm thay vì giá trị câu lệnh trả về;

Hai hàm sau trả về đầu ra tương đương. một đối tượng Hứa hẹn được giải quyết bằng mã trạng thái của yêu cầu GET được gửi tới địa chỉ được cung cấp trong tham số

mkdir async-await
cd async-await
git init
npx license mit > LICENSE
npx gitignore node
npm init -y
git add -A
git commit -m "Initial commit"
npm install esm
1

Nếu bạn muốn hàm

npm install readline-promise
9 trả về từ chối hàm
npm install readline-promise
7, hãy sử dụng câu lệnh
node -r esm start.js
1

Hàm

npm install readline-promise
7 không cần trả về giá trị; . Khi đó, nó tương đương với việc giải quyết
npm install readline-promise
9 mà không có giá trị

Hàm

node -r esm start.js
4 sẽ không phát ra bất kỳ dữ liệu nào khi Lời hứa của nó được giải quyết, nhưng trạng thái Lời hứa sẽ thay đổi thành đã hoàn thành hoặc bị từ chối. Bằng cách kiểm tra trạng thái Promise, chương trình có thể xác định xem hoạt động không đồng bộ có thành công hay không

chờ đợi

Từ khóa

npm install readline-promise
5 chỉ có thể được sử dụng với đối tượng Promise. Nó thông báo cho môi trường thời gian chạy JavaScript rằng nó sẽ tạm dừng thực thi chương trình cho đến khi Promise được liên kết giải quyết. Một hạn chế khác là chỉ có thể sử dụng
npm install readline-promise
5 bên trong hàm
npm install readline-promise
7

Để buộc thời gian chạy JavaScript giữ thực thi chương trình cho đến khi Lời hứa giải quyết và cung cấp một giá trị, hãy chèn từ khóa

npm install readline-promise
5 trước lời gọi Lời hứa

Để xử lý từ chối Promise, hãy đặt câu lệnh

npm install readline-promise
5 vào khối
Choose an option and press Enter(4) ExitYour choice:
0

Một cách khác để khai báo một hàm không đồng bộ nơi chứa logic là gọi nó sau khi nó được khởi tạo. Ví dụ: bạn có thể gói mã của mình trong một hàm không đồng bộ ẩn danh và gọi nó ngay lập tức

Giờ đây, bạn đã được ôn tập nhanh về cách hoạt động của quá trình xử lý không đồng bộ trong JavaScript và đã được giới thiệu về các từ khóa

npm install readline-promise
7 và
npm install readline-promise
5, bạn có thể có một số kinh nghiệm khi sử dụng các công cụ này trong tình huống thực tế

Hiểu dự án hướng dẫn

Trong hướng dẫn này, bạn sẽ tạo một ứng dụng bảng điều khiển với menu dòng lệnh tương tác. Đó là mã mà bạn có thể sử dụng lại trong các dự án bảng điều khiển của mình, chẳng hạn như các công cụ giao diện dòng lệnh (CLI)

Trong khi bạn đang xây dựng ứng dụng menu, hướng dẫn này sẽ cho bạn thấy các khía cạnh của từ khóa

npm install readline-promise
7 và
npm install readline-promise
5. Bạn sẽ sử dụng chúng để tạo các hàm trả về Lời hứa và gọi sự chờ đợi đồng bộ để Lời hứa giải quyết

Mã trong bài đăng này sử dụng thư viện lời hứa đọc để đọc đầu vào dòng lệnh, vì vậy bạn cũng sẽ có được một số kinh nghiệm với nó. Thư viện này mở rộng Node. js bằng cách thêm một trình lặp không đồng bộ và các tính năng khác

điều kiện tiên quyết

Để hoàn thành các nhiệm vụ trong hướng dẫn này, bạn sẽ cần các công cụ sau

  • Nút. js và npm (Nút. cài đặt js cũng sẽ cài đặt npm. )
  • Git
  • Visual Studio Code (hoặc IDE hoặc trình chỉnh sửa mã khác)

Để tận dụng tối đa bài đăng này, bạn cũng nên có kiến ​​thức cơ bản về JavaScript

Có một kho lưu trữ đồng hành chứa mã nguồn hoàn chỉnh cho dự án có sẵn trên GitHub

Tài khoản Twilio — Mặc dù hướng dẫn này không bắt buộc, nhưng nếu bạn đăng ký tài khoản Twilio bằng liên kết này, bạn có thể nhận thêm khoản tín dụng $10 cho tài khoản của mình

Thiết lập dự án

Bạn có hai tùy chọn để thiết lập Nút. dự án js cho hướng dẫn này. Bạn có thể

  1. sử dụng mã trong kho lưu trữ đồng hành, cũng bao gồm mã cho các bài đăng trước trong loạt bài này về JavaScript không đồng bộ
  2. bắt đầu từ đầu để dự án của bạn chỉ bao gồm mã trong hướng dẫn này

Để sao chép kho lưu trữ đồng hành, hãy thực hiện các hướng dẫn dòng lệnh sau trong thư mục mà bạn muốn tạo thư mục gốc của dự án

git clone https://github.com/maciejtreder/asynchronous-javascript.git
cd asynchronous-javascript
git checkout step16
npm install
mkdir async-await
cd async-await

Mã này bao gồm một số nhánh cung cấp mã minh họa cách sử dụng lệnh gọi lại JavaScript, Lời hứa, Đài quan sát RxJS và các tính năng JavaScript khác

Để chỉ bắt đầu dự án menu dòng lệnh từ đầu, hãy thực hiện các hướng dẫn dòng lệnh sau trong thư mục mà bạn muốn đặt thư mục gốc của dự án

mkdir async-await
cd async-await
git init
npx license mit > LICENSE
npx gitignore node
npm init -y
git add -A
git commit -m "Initial commit"
npm install esm

Bạn có thể tìm hiểu thêm về cách khởi tạo Node. js trong bài đăng này của Phil Nash của Twilio

Cài đặt thư viện

Choose an option and press Enter(4) ExitYour choice:
5 bằng lệnh sau trong thư mục gốc của dự án hoặc bên dưới

npm install readline-promise
Xây dựng ứng dụng

Mở dự án trong IDE hoặc trình chỉnh sửa mã bạn chọn

đang chờ (ing) đầu vào của người dùng

Để tạo điểm vào cho ứng dụng của bạn, hãy tạo điểm bắt đầu. js trong thư mục async-await và đặt mã JavaScript sau vào đó

Đoạn mã trên nhập thư viện

Choose an option and press Enter(4) ExitYour choice:
5, thư viện này sẽ được sử dụng để thu thập đầu vào từ người dùng và chuyển nó vào chương trình dưới dạng đối tượng Promise. Việc khai báo hằng số
Choose an option and press Enter(4) ExitYour choice:
7 thiết lập một thể hiện của đối tượng
Choose an option and press Enter(4) ExitYour choice:
8 bằng cách sử dụng cấu hình gán đầu ra cho đầu ra tiêu chuẩn của hệ thống và lắng nghe đầu vào của người dùng thông qua đầu vào tiêu chuẩn, cả hai đều là bảng điều khiển

Sau khi khởi tạo đối tượng

Choose an option and press Enter(4) ExitYour choice:
9, mã khai báo hằng số
git clone https://github.com/maciejtreder/asynchronous-javascript.git
cd asynchronous-javascript
git checkout step17
npm install
cd async-await
0. Đó là Bản đồ thể hiện các tùy chọn chương trình có sẵn để hiển thị trong menu. Cho đến nay, chỉ có một. "Lối ra". Bạn sẽ thêm nhiều tùy chọn hơn khi bạn tiến bộ trong quá trình viết ứng dụng

Hàm không đồng bộ

git clone https://github.com/maciejtreder/asynchronous-javascript.git
cd asynchronous-javascript
git checkout step17
npm install
cd async-await
1, là điểm vào của chương trình. Nó bắt đầu bằng cách xóa bảng điều khiển. Sau đó, nó lặp qua các thành phần của bản đồ
git clone https://github.com/maciejtreder/asynchronous-javascript.git
cd asynchronous-javascript
git checkout step17
npm install
cd async-await
0 và hiển thị các tùy chọn khả dụng trong bảng điều khiển. Sau khi hoàn thành, đã đến lúc chờ người dùng nhập dữ liệu

Trong phần khai báo của hằng số

git clone https://github.com/maciejtreder/asynchronous-javascript.git
cd asynchronous-javascript
git checkout step17
npm install
cd async-await
3, đoạn mã yêu cầu người dùng tương tác bằng cách sử dụng phương thức
git clone https://github.com/maciejtreder/asynchronous-javascript.git
cd asynchronous-javascript
git checkout step17
npm install
cd async-await
4. Phương thức này trả về một Lời hứa sẽ giải quyết khi người dùng nhập đầu vào

Bạn có thể sử dụng từ khóa

npm install readline-promise
5 cùng với lời gọi phương thức này, điều này sẽ gây ra sự chờ đợi đồng bộ cho đầu vào của người dùng và đặt thông tin đầu vào của người dùng vào hằng số
git clone https://github.com/maciejtreder/asynchronous-javascript.git
cd asynchronous-javascript
git checkout step17
npm install
cd async-await
3. Nó hữu ích ở đây vì cho đến khi bạn có thông tin từ người dùng, bạn không biết phải làm gì tiếp theo

Bằng cách sử dụng từ khóa

npm install readline-promise
5, bạn tránh được mức độ lồng nhau mà bạn sẽ phải sử dụng phương thức
git clone https://github.com/maciejtreder/asynchronous-javascript.git
cd asynchronous-javascript
git checkout step17
npm install
cd async-await
8 của đối tượng Promise. Bạn có thể tránh cuộc gọi bổ sung vì bạn đã khai báo hàm
git clone https://github.com/maciejtreder/asynchronous-javascript.git
cd asynchronous-javascript
git checkout step17
npm install
cd async-await
1 bằng cách sử dụng từ khóa
npm install readline-promise
7

Đầu vào của người dùng là một giá trị

node -r esm start.js
1, vì vậy phương thức
node -r esm start.js
2 chuyển đổi nó thành một số nguyên trước khi gán nó cho hằng số
git clone https://github.com/maciejtreder/asynchronous-javascript.git
cd asynchronous-javascript
git checkout step17
npm install
cd async-await
3. Ở cuối hàm, giá trị của
git clone https://github.com/maciejtreder/asynchronous-javascript.git
cd asynchronous-javascript
git checkout step17
npm install
cd async-await
3 được sử dụng trong câu lệnh
node -r esm start.js
5 để xác định hành động cần thực hiện. Cho đến nay, có hai

node -r esm start.js
6 kết thúc chương trình bằng cách gọi phương thức close của đối tượng
Choose an option and press Enter(4) ExitYour choice:
7, phương thức này sẽ xóa hàng đợi gọi lại và letNode.
node -r esm start.js
8 lối ra

node -r esm start.js
9 xử lý đầu vào bất hợp pháp. Nếu người dùng nhập một số nằm ngoài phạm vi hoặc bất kỳ đầu vào không hợp lệ nào khác, chức năng sẽ hiển thị thông báo trong bảng điều khiển. Sau đó, chương trình chờ xác nhận của người dùng và gọi hàm displayMenu theo cách đệ quy

Kiểm tra chức năng cơ bản

Đây là một điểm tốt để xem mọi thứ có hoạt động chính xác không

Chạy chương trình bằng cách nhập Node sau. js lệnh CLI trong thư mục async-await

node -r esm start.js

Bạn sẽ thấy đầu ra sau trong cửa sổ giao diện điều khiển

Choose an option and press Enter(4) ExitYour choice:

Sau khi chọn tùy chọn 4 bằng cách nhập “4” và xác nhận lựa chọn của bạn bằng cách nhấn Enter, chương trình sẽ thoát

Nếu bạn chưa theo dõi mã hóa và muốn bắt kịp bước này bằng cách sử dụng mã từ kho lưu trữ GitHub, hãy thực hiện các lệnh sau trong thư mục mà bạn muốn tạo thư mục dự án

git clone https://github.com/maciejtreder/asynchronous-javascript.git
cd asynchronous-javascript
git checkout step17
npm install
cd async-await
Tăng cường chương trình

Chắc chắn bạn không muốn chương trình của mình chỉ có một lựa chọn. "Lối ra"

Tạo một khoản tiền. js trong thư mục gốc của dự án và chèn mã JavaScript sau

Đoạn mã trên giới thiệu chức năng không đồng bộ

First operand: 3
Second operand: 1
Sum: 4
Press Enter to get back to the menu
0. Hàm trả về một đối tượng
First operand: 3
Second operand: 1
Sum: 4
Press Enter to get back to the menu
1, giải quyết bằng một số được tạo ngẫu nhiên từ 0 đến 10

Câu hỏi đặt ra là, tại sao hàm này trả về một giá trị

npm install readline-promise
9 trong khi câu lệnh
First operand: 3
Second operand: 1
Sum: 4
Press Enter to get back to the menu
3 gọi các phương thức trả về số nguyên? . nó báo cho bộ thực thi JavaScript gói phần thân hàm trong một ____11_______9 giải quyết với giá trị từ câu lệnh
First operand: 3
Second operand: 1
Sum: 4
Press Enter to get back to the menu
3

Hàm thứ hai,

First operand: 3
Second operand: 1
Sum: 4
Press Enter to get back to the menu
7, được xuất từ ​​tệp để bạn có thể sử dụng nó ngay từ đầu. js, nơi chứa điểm vào chương trình của bạn. Hàm xóa bảng điều khiển, chờ tạo các số ngẫu nhiên và thêm chúng. Trước khi hàm trả về, nó sẽ hiển thị các toán hạng và tổng của chúng

Lưu ý rằng khai báo hàm

First operand: 3
Second operand: 1
Sum: 4
Press Enter to get back to the menu
7 được đặt trước từ khóa
npm install readline-promise
7, vì vậy bạn có thể sử dụng
npm install readline-promise
5 trong đó để “mở gói” đối tượng Promise được trả về bởi hàm
First operand: 3
Second operand: 1
Sum: 4
Press Enter to get back to the menu
0. Nếu bạn không sử dụng
npm install readline-promise
5, bạn sẽ nhận được một đối tượng Promise mà bạn vẫn cần gọi phương thức
First operand: 2
Second operand: 0
Sum: 2
Time elapsed: 6006.825ms
Press Enter to get back to the menu
3 để lấy giá trị

Lưu ý rằng hàm

First operand: 3
Second operand: 1
Sum: 4
Press Enter to get back to the menu
7 không có câu lệnh
First operand: 3
Second operand: 1
Sum: 4
Press Enter to get back to the menu
3. Điều này, cùng với
npm install readline-promise
7 trong khai báo, chỉ ra rằng kiểu trả về của hàm là
First operand: 2
Second operand: 0
Sum: 2
Time elapsed: 6006.825ms
Press Enter to get back to the menu
7, một Lời hứa thông báo cho người gọi rằng một số hành động không đồng bộ đã được hoàn thành mà không cung cấp bất kỳ đầu ra nào của hoạt động đó

Thêm câu lệnh

First operand: 2
Second operand: 0
Sum: 2
Time elapsed: 6006.825ms
Press Enter to get back to the menu
8 sau vào đầu phần bắt đầu. tập tin js

Thêm một tùy chọn mới vào menu bằng cách thay thế khai báo

git clone https://github.com/maciejtreder/asynchronous-javascript.git
cd asynchronous-javascript
git checkout step17
npm install
cd async-await
0 hiện tại bằng khai báo sau

Thêm

First operand: 2
Second operand: 4
Sum: 6
Time elapsed: 3003.828ms
Press Enter to return to the menu
0 mới vào câu lệnh
node -r esm start.js
5 bên trong hàm
git clone https://github.com/maciejtreder/asynchronous-javascript.git
cd asynchronous-javascript
git checkout step17
npm install
cd async-await
1

Bây giờ, bất cứ khi nào người dùng chọn “1” từ menu, chương trình sẽ gọi hàm

First operand: 3
Second operand: 1
Sum: 4
Press Enter to get back to the menu
7, đợi nó kết thúc với
npm install readline-promise
5 và yêu cầu người dùng nhấn Enter để quay lại menu. Khi người dùng thực hiện thao tác này, hàm
git clone https://github.com/maciejtreder/asynchronous-javascript.git
cd asynchronous-javascript
git checkout step17
npm install
cd async-await
1 sẽ được gọi đệ quy

Sau những sửa đổi đó, bạn bắt đầu. js sẽ trông giống như tệp này trong kho lưu trữ đồng hành

Thử nghiệm ứng dụng nâng cao

Bây giờ bạn đã thêm một số chức năng vào ứng dụng, bạn có thể thực hiện một số thử nghiệm đáng giá

Chạy chương trình với Node sau. lệnh js

node -r esm start.js

Chọn tùy chọn 1 từ menu và xác minh xem nó có hoạt động như mong muốn không. Đầu ra của bạn phải tương tự như sau, với các giá trị của toán hạng và tổng thay đổi theo hầu hết các lần lặp

First operand: 3
Second operand: 1
Sum: 4
Press Enter to get back to the menu

Để đóng chương trình, nhấn Enter để quay lại menu và chọn tùy chọn “4”

Mã cho đến thời điểm này nằm trong nhánh step18 của kho lưu trữ đồng hành

Hiểu về cạm bẫy hiệu suất đang chờ đợi

Bạn đã có tính năng async-await dưới vành đai của mình, nhưng còn một điều nữa mà bạn cần lưu ý. Như bạn đã biết,

npm install readline-promise
5 đồng bộ chờ một
npm install readline-promise
9 giải quyết. Và nó thực sự làm, không có lòng thương xót. Đôi khi nó có thể làm tổn thương

Tạo một tệp mới có tên sumSlow. js và đặt mã JavaScript sau vào đó

Hàm này trả về một Lời hứa, sẽ giải quyết bằng một số được tạo ngẫu nhiên sau 3 giây. Để trì hoãn đầu ra, mã sử dụng hàm

mkdir async-await
cd async-await
git init
npx license mit > LICENSE
npx gitignore node
npm init -y
git add -A
git commit -m "Initial commit"
npm install esm
5, không đồng bộ

Thêm chức năng sau vào dưới cùng của sumSlow. tập tin js

Chức năng này rất giống với chức năng bạn đã triển khai trước đó. Logic bổ sung duy nhất là sử dụng

First operand: 2
Second operand: 4
Sum: 6
Time elapsed: 3003.828ms
Press Enter to return to the menu
9 và
mkdir async-await
cd async-await
git init
npx license mit > LICENSE
npx gitignore node
npm init -y
git add -A
git commit -m "Initial commit"
npm install esm
00 để đo tốc độ chạy của chức năng này

Nhập hàm

mkdir async-await
cd async-await
git init
npx license mit > LICENSE
npx gitignore node
npm init -y
git add -A
git commit -m "Initial commit"
npm install esm
01 vào đầu. js bằng cách thêm câu lệnh sau vào đầu tệp

Thêm một mục mới vào bản đồ

git clone https://github.com/maciejtreder/asynchronous-javascript.git
cd asynchronous-javascript
git checkout step17
npm install
cd async-await
0

Và một

First operand: 2
Second operand: 4
Sum: 6
Time elapsed: 3003.828ms
Press Enter to return to the menu
0 mới trong câu lệnh
node -r esm start.js
5 bên trong hàm
git clone https://github.com/maciejtreder/asynchronous-javascript.git
cd asynchronous-javascript
git checkout step17
npm install
cd async-await
1, điều khiển luồng chương trình

Chạy chương trình và chọn tùy chọn “2” từ menu. Kiểm tra xem hàm này cần bao nhiêu thời gian để trả về

First operand: 2
Second operand: 0
Sum: 2
Time elapsed: 6006.825ms
Press Enter to get back to the menu

Như bạn có thể thấy, chức năng cần hơn 6 giây để hoàn thành. Tại sao?

Trong quá trình truy xuất toán hạng đầu tiên, bạn đã chặn chương trình một cách đồng bộ bằng từ khóa

npm install readline-promise
5. Do đó, cuộc gọi thứ hai được bắt đầu sau 3 giây và mất thêm 3 giây nữa để giải quyết

Điều này có thể dễ dàng sửa chữa. Thêm chức năng sau vào dưới cùng của sumSlow. tập tin js

Sự khác biệt giữa

mkdir async-await
cd async-await
git init
npx license mit > LICENSE
npx gitignore node
npm init -y
git add -A
git commit -m "Initial commit"
npm install esm
01 và
mkdir async-await
cd async-await
git init
npx license mit > LICENSE
npx gitignore node
npm init -y
git add -A
git commit -m "Initial commit"
npm install esm
10 là cách bạn gọi những lời hứa

Bạn đã bắt đầu vòng đời của cả hai lời hứa cùng một lúc và sau đó bạn đã chặn chương trình bằng cách sử dụng từ khóa

npm install readline-promise
5 để chờ kết quả. Nhờ đó, những lời hứa đó đang chạy song song

Việc so sánh hai triển khai đó được mô tả trong sơ đồ bên dưới

Điều chỉnh câu lệnh nhập từ. /sumSlow ngay từ đầu. js bằng cách thêm

mkdir async-await
cd async-await
git init
npx license mit > LICENSE
npx gitignore node
npm init -y
git add -A
git commit -m "Initial commit"
npm install esm
10 để nó trông giống như sau

Thêm mục mới vào bản đồ

git clone https://github.com/maciejtreder/asynchronous-javascript.git
cd asynchronous-javascript
git checkout step17
npm install
cd async-await
0

Thêm mới một

First operand: 2
Second operand: 4
Sum: 6
Time elapsed: 3003.828ms
Press Enter to return to the menu
0 mới vào câu lệnh
node -r esm start.js
5 bên trong hàm
git clone https://github.com/maciejtreder/asynchronous-javascript.git
cd asynchronous-javascript
git checkout step17
npm install
cd async-await
1

Sau những sửa đổi đó, bạn bắt đầu. tệp js sẽ trông như thế này

Chạy chương trình và gọi chức năng bạn vừa thực hiện bằng cách chọn tùy chọn “3” từ menu. Trong bảng điều khiển, bạn sẽ thấy rằng thời gian đã trôi qua bằng khoảng một nửa so với lần triển khai đầu tiên

First operand: 2
Second operand: 4
Sum: 6
Time elapsed: 3003.828ms
Press Enter to return to the menu

Các giá trị thực tế của bạn sẽ khác một chút so với số hiển thị ở trên, dựa trên thời gian thực sự cần hệ thống của bạn để thực hiện phép tính

Mã cho đến thời điểm này là nhánh step19 trong kho lưu trữ đồng hành

Tóm lược

Bài đăng này cung cấp phần giới thiệu về cách xử lý không đồng bộ hoạt động trong JavaScript và cách gọi lại và Lời hứa cung cấp chức năng không đồng bộ. Nó cho bạn thấy cách các tính năng ngôn ngữ này hoạt động và sau đó mô tả cách các từ khóa

npm install readline-promise
7 và
npm install readline-promise
5 hoạt động với các tính năng đó để cung cấp quyền truy cập thuận tiện hơn và dễ đọc hơn vào quy trình xử lý không đồng bộ

Trong một dự án nghiên cứu điển hình, bạn đã thấy cách triển khai hệ thống menu dòng lệnh tương tác bằng cách sử dụng async, await và Promises. Bạn cũng đã thấy cách sử dụng thư viện readline-promise

tài nguyên bổ sung

Để tìm hiểu về các nguyên tắc cơ bản của JavaScript liên quan đến xử lý không đồng bộ, hãy xem bài đăng

JavaScript không đồng bộ. Hiểu các cuộc gọi lại

Nếu bạn muốn tìm hiểu thêm về JavaScript Promise, hãy xem các bài viết sau

JavaScript không đồng bộ. Giới thiệu về Lời hứa JavaScript
JavaScript không đồng bộ. Lời hứa nâng cao với nút. js
JavaScript không đồng bộ. Sử dụng RxJS Observables với API REST trong Node. js

Bạn cũng có thể muốn tìm hiểu về RxJS (ReactiveX JavaScript), một công cụ không đồng bộ tốt hơn cho một số tình huống lập trình

JavaScript không đồng bộ. Giới thiệu ReactiveX và RxJS Observables
JavaScript không đồng bộ. Sử dụng RxJS Observables với API REST trong Node. js

Ngoài ra còn có các tài nguyên của bên thứ 3 là tài liệu tham khảo cần thiết cho các nhà phát triển JavaScript. Ở đây có một ít

Tài liệu web MDN. Javascript — Mạng nhà phát triển Mozilla cung cấp một trang web tham khảo toàn diện về JavaScript, với các hướng dẫn và thông tin tham khảo

Nút. js Docs — Nếu bạn đang viết JavaScript phía máy chủ, Node. tài liệu tham khảo js là một tài nguyên thiết yếu

RxJS — Trang web cung cấp tài nguyên học tập và thông tin tham khảo cho RxJS, triển khai JavaScript của trình quan sát, các mẫu lặp cùng với lập trình chức năng với các bộ sưu tập

Tôi sử dụng nhà điều hành nào?

Bạn muốn tận hưởng niềm vui trong khi mài giũa kỹ năng lập trình của mình?

TwilioQuest — Đánh bại các thế lực của các hệ thống cũ với cuộc phiêu lưu theo phong cách 16-bit này

Tôi là Maciej Treder, hãy liên hệ với tôi qua contact@maciejtreder. com, https. //www. maciejtreder. com hoặc @maciejtreder trên GitHub, Twitter và LinkedIn