66 lượt xem
Ẩn danh
Ngày 22 Tháng 05
Em mới được review code và được feedback là không nên dùng forEach với async và await, vì có thể sau này xảy ra vấn đề. Nhưng mà sếp ko cho em biết vấn đề là gì, và bảo e về nhà tự tìm hiểu, nhưng theo em tự xem lại code thì cũng ok mà, ko có vấn đề gì. Mọi người có thể cho em gợi ý là có thể có vấn đề nào xảy ra được không ạ? Vd ở code sau mà ko dùng forEach thì mình nên dùng cú pháp nào để thay thế ạ? nhiều for quá nên giờ e cũng hơi hoang mang í ah
Đánh giá câu hỏi ngay!
Hãy ấn ↑Up Vote với những câu hỏi cụ thể và chi tiết
Hãy ấn ↓Down Vote với những câu hỏi chưa rõ ràng Careerly sẽ nhắc người hỏi chỉnh sửa lại.
3 câu trả lời
BEST
Đầu tiên thì kể cũng kỳ thật =)), như kiểu sếp của em không muốn chia sẻ kiến thức hoặc không có câu trả lời chính xác nào cả nên mới bảo em về tự mò trên google vậy =)) Có vài vấn đề anh muốn chia sẻ như sau: - Về câu hỏi của em sẽ khá dễ gây nhầm lẫn ở thứ tự sử dụng forEach và call API (async-await), trong trường hợp nếu em gọi 1 api trước sau đó có kết quả rồi em mới dùng tới forEach để xử lý kết quả đó thì cũng là "sử dụng đồng thời" => cách này không vấn đề gì cả. - Còn ở ví dụ của em là em đang dùng vòng lặp tuần tự trước để lặp việc gọi api bất đồng bộ, thì anh thấy cách tiếp cận này để lấy data của em đang không được tốt cho lắm hay nói cách khác là khá bad-code. Thông thường thực tế ít ai chạy vòng lặp tuần tự để gọi api như trên cả, vì như thế thì FE sẽ phải gọi quá nhiều API nếu số lượng page của em rất nhiều, thậm chí nếu dùng forEach chưa chắc kết quả đã trả về đúng thứ tự như mong muốn (Link tham khảo phần này a sẽ để bên dưới). Còn nếu em vẫn muốn làm như trên thì em có thể chuyển qua dùng Promise.all để chạy parallel nhé. - Về cách tiếp cận thực tế hơn trong trường hợp của em thì cách làm chuẩn là bảo đội BE xử lý làm một api fetch all comments riêng để FE chỉ gọi một lần thôi, hoặc cùng là API gọi lấy comment ban đầu thì bảo BE support thêm param để FE gửi lên kiểu per_page=all hoặc bằng một con số nào đó chẳng hạn để phía FE linh hoạt lấy số lượng bản ghi về là cách tốt nhất nhé. - Em có thể tham khảo thêm kiến thức về vụ forEach trên ở link này: https://stackoverflow.com/q/37576685/8324172
Bản chất là các cuộc gọi api trong pages.forEach vẫn được gọi một cách đồng thời mà không phải chờ đợi, tuy nhiên nếu bạn đang mong muốn thứ tự kết quả lấy về từ các page được sắp xếp (push) vào theo thứ tự thì có lẽ forEach không thể đảm bảo. forEach khi kết hợp với async/await không được thực hiện lần lượt mà nó sẽ cứ thế lặp qua. Nghĩa là nó không đợi await trước đó xong mới tiếp tục mà các await sẽ thực hiện một cách đồng thời. Do đó có thể xảy ra tình trạng await sau có kết quả sớm hơn await trước và nó được thêm vào comments trước. Để khắc phục, bạn có thể tham khảo các cách làm khác như sử dụng for...of: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of
Về cơ bản theo mình hiểu thì Array nó có thứ tự, tuy nhiên async nó là bất đồng bộ, việc API trả về data lúc nhanh lúc chậm thì là bình thường, nên cái kết quả trả về bạn nhận được có thể sẽ không còn đúng theo thứ tự mà bạn gọi, thế nên nếu như trong response không có cơ chế để đánh thứ tự mà bài toán của bạn cần data theo thứ tự thì chả biết đâu mà lần =)))
Đăng ký ngay bây giờ để đọc toàn bộ câu trả lời!
Cộng đồng lập trình viên sẽ giải đáp tường tận cho bạn.
Bạn đã có tài khoản rồi?
Đăng ký ngay bây giờ để đọc toàn bộ câu trả lời!
Cộng đồng lập trình viên sẽ giải đáp tường tận cho bạn.