Tôi thực sự đang gặp khó khăn ở đây để hiểu thấu bằng cách viết JavaScript không đồng bộ. bạn có thể vui lòng cung cấp một ví dụ về một hàm JavaScript đơn giản là không đồng bộ viết bằng đồng bằng JavaScript (và không sử dụng Node.js hoặc JQuery)Ví dụ đơn giản về hàm javascript không đồng bộ là gì?
Trả lời
Bản thân JavaScript là đồng bộ và đơn luồng. Bạn không thể viết một hàm không đồng bộ; JS đơn giản không có API thời gian. Sẽ không có tác dụng phụ từ các luồng song song.
Điều bạn có thể làm là sử dụng một số API do môi trường của bạn cung cấp (Node.js, Webbrowser) cho phép bạn lên lịch các tác vụ không đồng bộ - sử dụng timeouts, ajax, FileAPI, requestAnimationFrame
, nextTick
, WebWorkers, DOM events.
Một ví dụ sử dụng setTimeout
(cung cấp bởi HTML Timing API):
window.setTimeout(function() {
console.log("World");
}, 1000);
console.log("Hello");
Cập nhật: Kể từ ES6 có những lời hứa như một nguyên thủy không đồng bộ xây dựng vào đồng bằng Javascript, vì vậy bạn có thể làm
Promise.resolve("World").then(console.log); // then callbacks are always asynchronous
console.log("Hello");
Tuy nhiên, chúng không thực sự hữu ích khi bạn không thể chờ đợi (chẳng hạn như thời gian chờ). Và chúng cũng không thay đổi bất cứ điều gì về mô hình luồng, tất cả việc thực hiện là chạy hoàn thành mà không có bất kỳ sự kiện nào can thiệp vào giữa chừng.
Câu trả lời hay, nhưng là một ví dụ sử dụng 'bind' thực sự cần thiết? Có thể gây nhầm lẫn cho OP hơn nữa ... – bfavaretto
+1, rất đúng; nhiệm vụ 'async' chỉ là những nhiệm vụ được chuyển trong hàng đợi thực hiện. Do đó thủ thuật hữu ích (đôi khi) với 'setTimeout (func, 0)'.) – raina77ow
@bfavaretto: Không muốn lặp lại câu trả lời của Xeano. Thay đổi ngay bây giờ để giảm bớt sự nhầm lẫn :-) – Bergi
này là không đồng bộ:
setTimeout(function(){
console.log('1');
}, 2000);
console.log('2');
2 sẽ được ghi vào giao diện điều khiển trước 1. Vì setTimeout không đồng bộ.
Dưới đây là một ví dụ rất đơn giản:
for (var i = 0; i < 10; i++) {
window.setTimeout(function() {
console.log(i);
}, 2000);
}
Bạn có thể mong đợi những console.log()
cuộc gọi đến cho bạn thấy 0, 1, 2
vv, như trong đoạn này:
for (var i = 0; i < 10; i++) {
console.log(i);
}
Nhưng trong thực tế, chỉ 10
s sẽ in! Lý do mà các chức năng thông qua vào setTimeout
chức năng (như 'callback' đối số của nó) sẽ được gọi saufor
vòng lặp được hoàn thành - tức là, sau khi giá trị i
được thiết lập đến 10
Tuy nhiên, bạn nên hiểu một điều: tất cả các hoạt Javascript trong một trình duyệt thực hiện trên một chuỗi duy nhất; sự kiện không đồng bộ (chẳng hạn như lần nhấp chuột và bộ tính giờ) chỉ chạy khi có một mở trong hàng đợi thực hiện. Đây là a brilliant article được viết bởi John Resig về chủ đề này.
Vấn đề với vòng lặp là vấn đề phạm vi, không phải vì bản chất không đồng bộ. Nếu chúng được sắp xếp đúng, vòng lặp sẽ hoạt động như mong đợi. Mặc dù đó là một lời giải thích tốt về các hàm được truyền cho 'setTimout' thi hành _after_ vòng lặp' for' – Ian
- 1. Ví dụ đơn giản về DispatcherHelper
- 2. Ví dụ về Deadlock đơn giản
- 3. Ví dụ về tab kivy đơn giản
- 4. Ví dụ về Paypal IPN đơn giản?
- 5. MKAnnotation, ví dụ đơn giản
- 6. Ví dụ đơn giản về lỗi dấu chấm động/làm tròn là gì?
- 7. Ví dụ về hàm C đơn giản được triển khai nhanh hơn trong lắp ráp nội tuyến là gì?
- 8. Ví dụ sự kiện luồng đơn giản
- 9. Tìm kiếm ví dụ đơn giản về MVVM Light
- 10. Ví dụ đơn giản về sử dụng __setstate__ và __getstate__
- 11. Ví dụ về thuật ngữ LaTeX đơn giản
- 12. Ví dụ về toán tử ternary JavaScript với hàm
- 13. Bộ chọn ngày trong jqGrid, ví dụ đơn giản?
- 14. Ví dụ đơn giản oozie về truy vấn hive?
- 15. UINavigationController: Ví dụ đơn giản nhất
- 16. Android Scroller ví dụ đơn giản
- 17. Ví dụ đơn giản với Guice Servlets
- 18. Ví dụ về clojure? đối số đơn
- 19. ví dụ đơn giản cho Erlang memoization
- 20. Ví dụ gọi lại RMI đơn giản
- 21. MVC3 DropDownListFor - một ví dụ đơn giản?
- 22. Ví dụ yêu cầu không đồng bộ
- 23. Ví dụ hoạt hình tween đơn giản
- 24. Ví dụ đơn giản C++ hash_set
- 25. Qt: Ví dụ đơn giản cho Quazip
- 26. ANTLR: Có một ví dụ đơn giản không?
- 27. Một ví dụ đơn giản về thuật toán nhận biết bộ nhớ cache?
- 28. boost :: thread - Ví dụ đơn giản không hoạt động (C++)
- 29. Ví dụ đơn giản ASP.NET đơn giản (không có biểu mẫu web và MVC)
- 30. Ví dụ bfs đơn giản ... Tôi không nhận được nó
'setTimeout' ??? – Bergi
Trình xử lý sự kiện. –
@SLaks đọc câu trả lời của Bergi. Đó là cơ bản những gì tôi đang đề cập đến. – Ryan