Trang chủ » Mã hóa » Hiểu về JavaScript đồng bộ và không đồng bộ - Phần 1

    Hiểu về JavaScript đồng bộ và không đồng bộ - Phần 1

    Đồng bộkhông đồng bộ là những khái niệm khó hiểu trong JavaScript, đặc biệt là cho người mới bắt đầu. Hai hoặc nhiều thứ là đồng bộ khi họ xảy ra cùng một lúc (đồng bộ hóa) và không đồng bộ khi họ không (không đồng bộ).

    Mặc dù những định nghĩa này rất dễ đưa vào, nhưng nó thực sự phức tạp hơn vẻ ngoài của nó. Chúng ta cần tính đến chính xác những gì đang đồng bộ, và những gì không.

    Bạn có thể gọi một bình thường Chức năng trong JavaScript đồng bộ, phải không? Và nếu nó giống như setTimeout () hoặc AJAX mà bạn đang làm việc cùng, bạn sẽ gọi nó là không đồng bộ, đúng không? Nếu tôi nói với bạn rằng cả hai không đồng bộ theo cách?

    Để giải thích tại sao, chúng tôi cần chuyển sang Mr X để được giúp đỡ.

    Kịch bản 1 - Mr X đang cố gắng đồng bộ

    Đây là thiết lập:

    1. Mr X là người có thể trả lời những câu hỏi hóc búa và thực hiện bất kỳ nhiệm vụ nào được yêu cầu.
    2. Cách duy nhất để liên lạc với anh ta là thông qua một cuộc gọi điện thoại.
    3. Bất kể câu hỏi hoặc nhiệm vụ nào bạn có, để yêu cầu sự giúp đỡ của ông X thực hiện nó; bạn gọi anh ấy.
    4. Mr X cho bạn câu trả lời hoặc hoàn thành nhiệm vụ ngay lập tức, và cho bạn biết xong rôi.
    5. Bạn đặt nội dung người nhận xuống và đi xem phim.

    Những gì bạn vừa thực hiện là một giao tiếp đồng bộ (qua lại) với ông X. Ông lắng nghe khi bạn hỏi ông câu hỏi của bạn và bạn lắng nghe khi ông trả lời.

    Kịch bản 2 - Mr X không hài lòng với tính đồng bộ

    Vì ông X rất hiệu quả, ông bắt đầu nhận được nhiều cuộc gọi hơn. Vì vậy, những gì xảy ra khi bạn gọi anh ta nhưng anh ấy đã bận nói chuyện với người khác? Bạn sẽ không thể hỏi anh ấy câu hỏi của bạn - cho đến khi anh ấy được tự do nhận cuộc gọi của bạn. Tất cả những gì bạn sẽ nghe là một giai điệu bận rộn.

    Vậy ông X có thể làm gì để chống lại điều này?

    Thay vì nhận cuộc gọi trực tiếp:

    1. Mr X thuê một anh chàng mới, Mr M và đưa cho anh ta một máy trả lời cho những người gọi để lại tin nhắn.
    2. Công việc của ông M là gửi tin nhắn từ máy trả lời đến Mr X một khi anh biết Mr X đã xử lý xong tất cả các tin nhắn trước đó và đã tự do lấy một cái mới.
    3. Vì vậy, bây giờ khi bạn gọi cho anh ấy, thay vì nhận được âm báo bận rộn, bạn có thể để lại tin nhắn cho Mr X, sau đó chờ anh ấy gọi lại cho bạn (chưa có thời gian chiếu phim).
    4. Khi Mr X hoàn thành tất cả các tin nhắn xếp hàng mà anh ấy nhận được trước bạn, anh ấy sẽ xem xét vấn đề của bạn và Gọi lại cho bạn để cho bạn một câu trả lời.

    Bây giờ đây là câu hỏi: những hành động cho đến nay đồng bộ hoặc không đồng bộ?

    Đó là hỗn hợp. Khi bạn để lại tin nhắn của bạn, Ông X đã không lắng nghe nó, vì vậy giao tiếp thứ tư không đồng bộ.

    Nhưng, khi anh trả lời, bạn đã ở đó lắng nghe, mà làm cho giao tiếp trở lại đồng bộ.

    Tôi hy vọng bây giờ bạn đã có được sự hiểu biết tốt hơn về cách đồng bộ hóa được cảm nhận về mặt giao tiếp. Thời gian để đưa vào JavaScript.

    JavaScript - Ngôn ngữ lập trình không đồng bộ

    Khi ai đó gắn nhãn JavaScript không đồng bộ, những gì họ nói chung nói chung là cách bạn có thể để lại lời nhắn cho nó, và không bị chặn cuộc gọi của bạn với giọng điệu bận rộn.

    Các cuộc gọi chức năng là không bao giờ trực tiếp trong JavaScript, họ thực sự đã hoàn thành qua tin nhắn.

    JavaScript sử dụng một Hàng đợi tin nhắn nơi các tin nhắn đến (hoặc sự kiện) được tổ chức. An vòng lặp sự kiện (một người gửi tin nhắn) tuần tự gửi những tin nhắn đó đến một ngăn xếp cuộc gọi trong đó các chức năng tương ứng của tin nhắn là xếp chồng lên nhau như khung (tranh luận hàm & biến) để thực thi.

    Ngăn xếp cuộc gọi giữ khung của chức năng ban đầu được gọi và bất kỳ khung nào khác cho các chức năng được gọi thông qua các cuộc gọi lồng nhau trên nó .

    Khi một tin nhắn tham gia vào hàng đợi, nó sẽ đợi cho đến khi ngăn xếp cuộc gọi được trống tất cả các khung từ tin nhắn trước, và khi có, vòng lặp sự kiện giải quyết các tin nhắn trước đó, và thêm các khung tương ứng của tin nhắn hiện tại vào ngăn xếp cuộc gọi.

    Tin nhắn sẽ đợi một lần nữa cho đến khi ngăn xếp cuộc gọi trở thành trống các khung tương ứng của chính nó (tức là việc thực thi tất cả các hàm xếp chồng đã kết thúc), sau đó bị mất hiệu lực.

    Hãy xem xét các mã sau đây:

     hàm foo ()  thanh chức năng () foo ();  hàm baz () bar ();  baz (); 

    Hàm đang chạy là baz () (ở hàng cuối cùng của đoạn mã), trong đó một tin nhắn được thêm vào hàng đợi, và khi vòng lặp sự kiện chọn nó, ngăn xếp cuộc gọi bắt đầu xếp chồng khung cho baz (), quán ba(), và foo () tại các điểm thực hiện liên quan.

    Khi việc thực hiện các chức năng hoàn thành từng cái một, các khung của chúng là xóa khỏi ngăn xếp cuộc gọi, trong khi tin nhắn là vẫn đang đợi trong hàng đợi, cho đến khi baz () được bật ra từ ngăn xếp.

    Hãy nhớ rằng, các cuộc gọi chức năng là không bao giờ trực tiếp trong JavaScript, họ đã xong qua tin nhắn. Vì vậy, bất cứ khi nào bạn nghe ai đó nói rằng chính JavaScript là ngôn ngữ lập trình không đồng bộ, hãy giả sử rằng họ đang nói về tích hợp sẵn của nó “máy trả lời”, và làm thế nào bạn có thể để lại tin nhắn.

    Nhưng những gì về các phương pháp không đồng bộ cụ thể?

    Cho đến nay tôi đã không chạm vào các API như setTimeout () và AJAX, đó là những người đặc biệt gọi là không đồng bộ. Tại sao vậy?

    Điều quan trọng là phải hiểu chính xác những gì là đồng bộ hoặc không đồng bộ. JavaScript, với sự trợ giúp của các sự kiện và vòng lặp sự kiện, có thể thực hành xử lý tin nhắn không đồng bộ, nhưng điều đó không có nghĩa mọi điều trong JavaScript không đồng bộ.

    Hãy nhớ rằng, tôi đã nói với bạn rằng tin nhắn đã không rời đi cho đến khi ngăn xếp cuộc gọi được trống các khung tương ứng của nó, giống như bạn đã không đi xem phim cho đến khi bạn nhận được câu trả lời của mình - đó là đồng bộ, bạn đang đợi cho đến khi nhiệm vụ hoàn thành, và bạn nhận được câu trả lời.

    Đang chờ đợi không lý tưởng trong mọi tình huống. Điều gì sẽ xảy ra nếu sau khi để lại tin nhắn, thay vì chờ đợi, bạn có thể rời khỏi bộ phim? Điều gì sẽ xảy ra nếu một chức năng có thể nghỉ hưu (làm trống ngăn xếp cuộc gọi) và thông điệp của nó có thể bị mất ngay cả trước khi nhiệm vụ của chức năng hoàn thành? Điều gì xảy ra nếu bạn có thể thực thi mã không đồng bộ?

    Đây là nơi các API như setTimeout () và AJAX xuất hiện trong bức tranh, và những gì họ làm là giữ vững, tôi không thể giải thích điều này mà không quay lại với Mr X, mà chúng ta sẽ thấy trong phần thứ hai của bài viết này. Hãy theo dõi.