Làm thế nào để mã Javascript trở nên không đồng bộ khi sử dụng các cuộc gọi lại?


26

Tôi đã đọc rất nhiều trên mạng khi cố gắng tìm ra cách viết mã JavaScript không đồng bộ. Một trong những kỹ thuật đã xuất hiện rất nhiều trong nghiên cứu của tôi là sử dụng các cuộc gọi lại. Trong khi tôi hiểu quy trình về cách viết và thực thi chức năng gọi lại, tôi bối rối tại sao các cuộc gọi lại dường như tự động làm cho việc thực thi JavaScript không đồng bộ. Vì vậy, câu hỏi của tôi là: làm thế nào để thêm các hàm gọi lại vào mã JavaScript của tôi làm cho mã được nói tự động không đồng bộ?


2
Bạn có thể thích đọc cách trình duyệt đạt được điều này trong một chuỗi, được viết bởi John Resig: ejohn.org/blog/how-javascript-timers-work
Jalayn

@Jalayn. Cảm ơn. Nhận xét của bạn đã làm cho tất cả sự khác biệt sau khi đọc một số câu trả lời.
kushalvm

Câu trả lời:


26

Nó không. Chỉ cần thực hiện một cuộc gọi lại hoặc chuyển một cuộc gọi lại không có nghĩa là nó không đồng bộ.

Ví dụ, .forEachhàm có một cuộc gọi lại nhưng đồng bộ.

var available = false;
[1,2,3].forEach( function(){
    available = true;
});
//code here runs after the whole .forEach has run,
//so available === true here

Việc setTimeoutgọi lại cũng vậy và không đồng bộ.

function myFunction( fn ) {
    setTimeout( function() {
        fn(1,2,3);
    }, 0 );
}

var available = false;
myFunction( function() {
    available = true;
});
//available is never true here

Việc kết nối với bất kỳ sự kiện không đồng bộ nào trong Javascript luôn yêu cầu gọi lại nhưng điều đó không có nghĩa là các chức năng gọi hoặc chuyển chúng xung quanh luôn không đồng bộ.


2
@SteveEvers Tôi đoán bạn có thể chỉnh sửa bài viết MDN sau đó. Gọi lại là một thuật ngữ rất phổ biến trong javascript cho bất kỳ chức năng nào được chuyển cho một chức năng khác gọi lại cho bạn bằng cách sử dụng chức năng bạn đã đưa ra ... tại sao lại làm phức tạp nó? Chỉnh sửa: Gọi lại cũng được sử dụng trong thông số kỹ thuật
Esailija

3
@SteveEvers "gọi lại ngụ ý asyncrony" là một idiosyncrasy C # / Microsoft. vi.wikipedia.org/wiki/Callback_(computer_programming)
Esailija

1
@MikeBrown Tôi đoán rằng tôi đã đọc quá nhiều vào hồ sơ của anh ấy và điều này - câu trả lời được đánh giá cao nhất chắc chắn đưa ra một ý tưởng rằng "cuộc gọi lại ngụ ý không đồng bộ".
Esailija

1
Nhưng điều đó đang được nói @SteveEvers cũng sai. Cuộc gọi lại không bao hàm sự không đồng bộ, chỉ là người khác sẽ chịu trách nhiệm "gọi lại".
Michael Brown

1
+1 vì Steve Evers sai
slebetman

23

Bí mật của "ma thuật" là các sự kiện mà bạn đang gán các cuộc gọi lại không đồng bộ. Họ đã triển khai "dưới mui xe" để quan tâm đến bất cứ điều gì họ đang làm (chẳng hạn như lấy một cái gì đó từ một máy chủ từ xa) trong nền, bên ngoài hộp cát JS. Và sau khi hoàn thành công việc, họ gửi cho công cụ JS một thông báo để gọi một sự kiện. Khi công cụ JS kết thúc với bất cứ điều gì nó đang làm, nó sẽ gọi bất kỳ sự kiện nào được xếp hàng (hoặc chờ một tin nhắn mới) và sau đó cuộc gọi lại của bạn được gọi một cách "không đồng bộ" một cách kỳ diệu!

( LƯU Ý: Đây là một tổng quan khái niệm cao cấp về chủ đề không đi sâu vào chi tiết, bởi vì các công cụ JS khác nhau sẽ triển khai mọi thứ theo những cách khác nhau. Nhưng đây là ý tưởng chung về cách thức hoạt động của nó.)


Những sự kiện này là gì? Một ví dụ về một hoặc hai sự kiện như vậy sẽ làm cho câu trả lời của bạn trở nên tốt hơn.
Jo Smo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.