Bài viết được chuyển ngữ từ tựa gốc Javascript loops: How to handle async/await


Làm thế nào để sử dụng vòng lặp bất đồng bộ trong lập trình tuần tự hoặc lập trình song song?
Trước khi bắt đầu với vòng lặp bất đồng bộ ma thuật, tôi muốn giúp bạn nhớ lại chúng ta viết một vòng lặp thuần tuý như thế nào?

Vòng lặp đồng bộ

Thời gian trước tôi đã viết vòng lặp như sau:
For Loop Classical
Nó trông cũng tốt, nhanh, nhưng nó có vấn đề về tính dễ đọc, nhìn và bảo trì. Nên tôi sử dụng một phiên bản tốt hơn như sau:

Javascript là ngôn ngữ phát triển rất nhanh chóng. Chúng có thêm nhiều tính năng và cú pháp mới. Một trong những tính năng mà tôi thích là async/await. Tôi sử dụng chúng với tuần suất cũng nhiều. Và đôi khi có tính huống tôi muốn tác động đến các phần tử có trong mảng theo hướng bất đồng bộ.

Vòng lặp bất động bộ

Làm cách nào ta có thể dùng await trong vòng lặp? Cùng viết hàm async và await cho mỗi tác vụ.

Đoạn mã nguồn trên sẽ trả về lỗi cú pháp. Tại sao vậy? Bởi chúng ta không thể sử dụng await bên trong một hàm đồng bộ. Như là bạn có thể thấy hàm processArray là một hàm bất đồng bộ. Nhưng hàm vô danh mà chúng ta sử dụng forEach là thuộc dạng đồng bộ.

1. Đừng có đợi kết quả trả về

Làm thế nào để khắc phục vấn đề ở trên? Chúng ta có thể định nghĩa một hàm vô danh như theo dạng bất đồng bộ như sau:

Nhưng forEach sẽ không đợi cho đến khi toàn bộ các phần tử trong mảng được duyệt hết. Nó sẽ chỉ chạy các tác vụ và tiếp tục chạy đến phần kế tiếp. Để chứng minh việc đó ta sẽ viết một chương trình đơn giản:

Ta sẽ thu được kết quả như sau:
[
    Done!
    1
    2
    3

]
Nó có thể ổn nếu bạn không muốn phải đợi các kết quả. Nhưng các trường hợp trên đây không phải là một ví dụ tốt.
2. Xử lý mảng trong lập trình tuần tự
Nếu đợi kết quả in ra chúng ta nên quay trở lại vòng lặp for cơ bản, nhưng giờ là thời điểm để sử dụng forof (Cảm ơn giao thức lặp) để mã ngắn và dễ đọc hơn:

Đoạn mã trên sẽ cho ta kết quả sau:
[
    1
    2
    3
    Done!

]
Đoạn mã nguồn sẽ xử lý lần lượt từng phần tử. Nhưng chúng ta có thể triển khai nó dưới dạng lập trình song song!
3. Xử lý mảng trong lập trình song song
Chúng ta có thể thay đổi chút ít mã để có thể biến các hàm async chạy song song:

Đoạn mã sẽ chạy nhiều tác vụ delayedLog cùng một lúc. Nhưng hãy cẩn thận với những mảng lớn (Quá nhiều tác vụ cùng chạy một lúc có thể gây ra vấn đề quá tải cho CPU và bộ nhớ).
Hiện tại bên mình đang cố gắng đạt lượng Like trên Facebook để sắp tới bọn mình muốn chạy một số khoá học online trên Youtube thế nên mong các bạn hãy ủng hộ và tiếp sức cho nhóm mình nhé. Xin cảm ơn các bạn!!!!