Vấn đề duy nhất với lời hứa là IE không hỗ trợ họ. Edge có, nhưng có rất nhiều IE 10 và 11 ngoài kia: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise (khả năng tương thích ở phía dưới)
Vì vậy, JavaScript là một luồng đơn. Nếu bạn không thực hiện cuộc gọi không đồng bộ, nó sẽ hoạt động theo dự đoán. Chuỗi JavaScript chính sẽ thực thi hoàn toàn một chức năng trước khi thực hiện chức năng tiếp theo, theo thứ tự chúng xuất hiện trong mã. Thứ tự đảm bảo cho các chức năng đồng bộ là không đáng kể - mỗi chức năng sẽ thực hiện hoàn toàn theo thứ tự mà nó được gọi.
Hãy nghĩ về chức năng đồng bộ như một đơn vị nguyên tử của công việc . Chuỗi JavaScript chính sẽ thực thi nó đầy đủ, theo thứ tự các câu lệnh xuất hiện trong mã.
Nhưng, ném vào cuộc gọi không đồng bộ, như trong tình huống sau:
showLoadingDiv(); // function 1
makeAjaxCall(); // function 2 - contains async ajax call
hideLoadingDiv(); // function 3
Điều này không làm những gì bạn muốn . Nó ngay lập tức thực thi chức năng 1, chức năng 2 và chức năng 3. Đang tải div flash và nó đã biến mất, trong khi cuộc gọi ajax gần như không hoàn thành, mặc dù makeAjaxCall()
đã trả về. KHIẾU NẠI là makeAjaxCall()
đã chia công việc của nó thành các khối được nâng cao từng chút một theo từng vòng của luồng JavaScript chính - nó hoạt động không đồng bộ. Nhưng cùng một luồng chính, trong một lần quay / chạy, đã thực hiện các phần đồng bộ một cách nhanh chóng và có thể dự đoán được.
Vì vậy, cách tôi xử lý nó : Giống như tôi đã nói chức năng là đơn vị nguyên tử của công việc. Tôi đã kết hợp mã của hàm 1 và 2 - Tôi đặt mã của hàm 1 vào hàm 2, trước khi gọi asynch. Tôi đã loại bỏ chức năng 1. Mọi thứ lên đến và bao gồm cả cuộc gọi không đồng bộ thực hiện theo thứ tự dự đoán.
THEN, khi cuộc gọi không đồng bộ hoàn thành, sau một vài lần quay của luồng JavaScript chính, nó có chức năng gọi 3. Điều này đảm bảo thứ tự . Ví dụ, với ajax, trình xử lý sự kiện onreadystatechange được gọi nhiều lần. Khi nó báo cáo nó đã hoàn thành, sau đó gọi hàm cuối cùng bạn muốn.
Tôi đồng ý nó lộn xộn hơn. Tôi thích có mã đối xứng, tôi thích có các hàm làm một việc (hoặc gần với nó) và tôi không thích có cuộc gọi ajax theo bất kỳ cách nào chịu trách nhiệm cho màn hình (tạo ra sự phụ thuộc vào người gọi). NHƯNG, với một cuộc gọi không đồng bộ được nhúng trong một chức năng đồng bộ, các thỏa hiệp phải được thực hiện để đảm bảo thứ tự thực hiện. Và tôi phải viết mã cho IE 10 nên không hứa hẹn.
Tóm tắt : Đối với các cuộc gọi đồng bộ, thứ tự đảm bảo là không đáng kể. Mỗi hàm thực hiện đầy đủ theo thứ tự nó được gọi. Đối với một chức năng có một cuộc gọi không đồng bộ, cách duy nhất để đảm bảo trật tự là theo dõi khi cuộc gọi async hoàn thành và gọi chức năng thứ ba khi phát hiện trạng thái đó.
Để thảo luận về các chủ đề JavaScript, hãy xem: https://medium.com/@francesco_rizzi/javascript-main-thread-dissected-43c85fce7e23 và https://developer.mozilla.org/en-US/docs/Web/JavaScript/ Sự kiện
Ngoài ra, một câu hỏi tương tự, được đánh giá cao về chủ đề này: Làm thế nào tôi nên gọi 3 hàm để thực hiện lần lượt từng hàm?
firstFunction
chính xác làm điều đó làm cho nó không đồng bộ? Dù bằng cách nào - hãy kiểm tra về những lời hứa