Hướng dẫn can you make javascript synchronous? - bạn có thể tạo javascript đồng bộ không?
Kể từ khi phát hành ECMAScript 2017 (ES8) và việc áp dụng hỗ trợ theo mặc định trên Node.js 7.6, bạn không còn lý do nào vì không sử dụng một trong các tính năng ES8 nóng nhất, đó là Nhưng trước hết, vì những lời hứa là nền tảng của các chức năng ASYNC, để có thể nắm bắt nội dung của bài viết này, bạn sẽ cần một kiến thức đáng tin cậy về những lời hứa và ít nhất là nhận thức về máy phát điện. Trong bài viết này, chúng tôi đã giành được độ sâu trong cả hai tính năng sử dụng và chức năng, nhưng để thực sự hiểu cách thức hoạt động của nó, tôi thực sự khuyên bạn nên sử dụng loạt ponyfoo này, bao gồm hoàn toàn mọi thứ bạn phải biết về lời hứa, máy phát điện, v.v. Lời hứa đã hạ cánh trên JavaScript như là một phần của tiêu chuẩn ECMAScript 2015 (ES6) và tại thời điểm phát hành, nó đã thay đổi cách các nhà phát triển sử dụng để viết mã không đồng bộ. Một trong những thành tựu hứa hẹn quan trọng nhất là nó làm giảm đáng kể sự phức tạp của mã không đồng bộ, cải thiện mức độ dễ đọc, bên cạnh việc giúp chúng ta thoát khỏi Kim tự tháp Doom (còn được gọi là địa ngục gọi lại). Bằng cách sử dụng lời hứa, một yêu cầu đơn giản cho API GitHub trông như thế này: OK, tôi phải thừa nhận rằng nó khá rõ ràng và chắc chắn làm cho sự hiểu biết dễ tiếp cận hơn so với khi sử dụng các cuộc gọi lại lồng nhau, nhưng nếu tôi nói với bạn rằng chúng ta có thể viết mã không đồng bộ như thế này, bằng cách sử dụng Nó chỉ đơn giản là khả năng đọc ở đầu của nó. Bạn có thể xác định từng bước của quy trình một cách rõ ràng, giống như nếu bạn đã đọc một mã đồng bộ, nhưng nó hoàn toàn không đồng bộ! Ngay cả trong ví dụ giả định ở trên, nó cũng rõ ràng, chúng tôi đã lưu một lượng mã kha khá. Chúng tôi đã phải viết Những lợi thế nhỏ cộng lại nhanh chóng, điều này sẽ trở nên rõ ràng hơn trong các ví dụ mã sau. Vì vậy, hãy để Lừa nhảy vào thực hiện các chức năng Async. Bất kỳ hàm async nào trả về một lời hứa ngầm và giá trị được giải quyết của lời hứa sẽ là bất cứ lợi nhuận nào từ chức năng của bạn. Hàm của chúng tôi có từ khóa Nếu lời hứa giải quyết, chúng ta có thể tương tác ngay lập tức với nó trên dòng tiếp theo. Và nếu nó từ chối, thì một lỗi được ném. Vì vậy, Điều đó cho phép chúng tôi viết mã trông đồng bộ ngay từ cái nhìn đầu tiên nhưng không đồng bộ dưới mui xe, và đó là phần tốt nhất về Chịu trách nhiệm (xử lý lỗi)Có một vài vấn đề mà tôi đã gặp phải khi chơi với điều này, vì vậy, thật tốt khi nhận thức được chúng.
Một trong những vấn đề ngấm ngầm nhất khi làm việc với các chức năng Async là bạn phải cẩn thận vì các lỗi bị nuốt một cách âm thầm (!!) trong một hàm ASYNC - giống như bên trong những lời hứa tiêu chuẩn. Trừ khi chúng tôi thêm một Trong ví dụ dưới đây mà chúng tôi sử dụng lời hứa, Bây giờ hãy xem cùng một mã, nhưng lần này sử dụng Lời khuyên của tôi là đảm bảo rằng các chức năng Đối phó với các điều kiệnHãy xem xét một khối mã như mã bên dưới tìm nạp một số dữ liệu và quyết định xem nó sẽ trả về hoặc nhận thêm chi tiết dựa trên một số giá trị trong dữ liệu. Ví dụ có điều kiện sử dụng lời hứaChỉ cần nhìn vào điều này cho bạn ớn lạnh. Nó dễ dàng bị lạc trong tất cả các tổ (6 cấp), niềng răng và các tuyên bố trở lại chỉ cần thiết để tuyên truyền kết quả cuối cùng cho đến lời hứa chính. Ví dụ này trở nên dễ hiểu hơn khi viết lại với Khá gọn gàng, hả? Chúng tôi đã giảm mức thụt ở hai cấp độ và biến nó thành dễ đọc hơn nhiều, đặc biệt là bằng cách sử dụng lợi nhuận sớm. Vòng lặpCác chức năng Async trở nên thực sự ấn tượng khi nói đến sự lặp lại. Chẳng hạn, hãy để nói rằng chúng tôi muốn chèn một số bài đăng vào cơ sở dữ liệu của chúng tôi, nhưng theo tuần tự. Đó là, chúng tôi muốn những lời hứa thực hiện lần lượt, không đồng thời. Bằng cách sử dụng lời hứa, chúng tôi phải thực hiện chuỗi hứa hẹn của mình. Hãy xem xét ví dụ dưới đây minh họa rằng: .then 2Ví dụ trên hoạt động, nhưng chắc chắn là khó coi. Nó cũng dễ bị lỗi, bởi vì nếu bạn vô tình làm một cái gì đó như khối mã bên dưới, thì lời hứa sẽ thực hiện đồng thời, điều này có thể dẫn đến kết quả bất ngờ. Ví dụ thứ hai sử dụng foreach và lời hứaTuy nhiên, sử dụng các chức năng Async, chúng ta chỉ có thể sử dụng vòng lặp Ồ, nhưng lưu ý rằng bạn không thể sử dụng bất kỳ vòng lặp Nhưng có lẽ bạn nghĩ rằng một cái gì đó như thế này có thể hoạt động, sau tất cả, có một từ khóa Không may măn. Một lần nữa, mã này không hoạt động, nhưng có một cảnh báo: lời hứa được trả lại bởi Tiếp tục: Toàn bộ ý tưởng ở đây là không Tuần tự so với song songĐiều quan trọng cần lưu ý là, ngay cả khi sử dụng các hàm Async và mã của bạn không đồng bộ, nó sẽ được thực thi theo cách nối tiếp, điều đó có nghĩa là một câu lệnh (ngay cả những câu không đồng bộ) sẽ thực hiện từng câu này. Nhưng vì các chức năng ASYNC trở thành lời hứa, chúng ta có thể sử dụng một quy trình công việc để chúng ta sử dụng cho những lời hứa để xử lý sự song song. Hãy nhớ rằng với những lời hứa chúng ta có Sử dụng Đơn giản như thế. Lưu ý rằng các phần quan trọng nhất là, trước tiên, tạo ra mảng lời hứa, bắt đầu gọi tất cả các lời hứa ngay lập tức. Thứ hai, chúng tôi đang chờ đợi những lời hứa trong chức năng chính. Hãy xem xét khối mã bên dưới, minh họa ba lời hứa khác nhau sẽ thực hiện song song. Ví dụ thứ hai cho thấy sự đồng tình với async/chờ đợiNhư ví dụ đầu tiên, đầu tiên chúng tôi tạo ra một loạt các lời hứa (mỗi một trong số các hàm Để hiểu rõ hơn về cách thức hoạt động, bạn phải nhận thức được rằng nếu một trong những lời hứa thất bại, tất cả chúng sẽ bị hủy bỏ, điều gì sẽ dẫn đến - trong ví dụ trước của chúng tôi - không ai trong ba biến này nhận được giá trị dự kiến. Kiểm tra đơn vị với các chức năng AsyncBằng cách sử dụng các chức năng Async, bạn thậm chí có thể áp dụng các thử nghiệm đơn vị cho các chức năng của mình. Mã sau đây sử dụng mocha tự động tác để kiểm tra đơn vị các hàm không đồng bộ Thử nghiệm này luôn thành công, bởi vì Mocha không đợi cho đến khi các xác nhận trong dòng Thuận tiện, các chức năng Async luôn trả lại lời hứa, điều này làm cho chúng hoàn hảo cho loại bài kiểm tra đơn vị này. Ví dụ kiểm tra đơn vị với async/chờ đợiKhá đơn giản, hả? Do đó, có hai lợi thế khi sử dụng các hàm ASYNC cho các thử nghiệm đơn vị không đồng bộ trong Mocha: Mã này sẽ ngắn gọn hơn và những lời hứa trở lại cũng được thực hiện. Lời khuyên nhanh chóng và phải nhớ
Sử dụng async/await ngày hôm nayNhư đã chỉ vào đầu bài viết này, Node.js 7.6 đã được phát hành vài tháng trước (và Node.js 8, là phiên bản chính, đã được phát hành chỉ vài tuần trước), mang lại cho chúng tôi sự hỗ trợ và bảo hiểm mặc định cho Sự kết luậnCác chức năng ASYNC là một khái niệm trao quyền được hỗ trợ đầy đủ và có sẵn trong ES8. Họ trả lại cho chúng tôi các Và điều tốt là ngay cả Node.js 8 vẫn không phải là bản phát hành LTS (hiện tại nó trên V6.11.0), việc di chuyển cơ sở mã của bạn sang phiên bản mới rất có thể sẽ không cần nỗ lực. Đặc biệt cảm ơn tất cả những người đã giúp tôi xem lại bản nháp của bài viết này. Bạn thật tuyệt vời! :) JavaScript có thể đồng bộ không?JavaScript là spoiler đồng bộ: Tại cơ sở của nó, JavaScript là một ngôn ngữ đồng bộ, chặn, đơn luồng.Điều đó chỉ có nghĩa là chỉ có một hoạt động có thể được tiến hành tại một thời điểm.Đó không phải là toàn bộ câu chuyện, mặc dù!
Spoiler: at its base, JavaScript is a synchronous, blocking, single-threaded language. That just means that only one operation can be in progress at a time. That's not the entire story, though!
Là JavaScript thực sự không đồng bộ?JavaScript là một ngôn ngữ lập trình đồng thời, không chặn, không đồng bộ, không đồng thời với rất nhiều sự linh hoạt. with lots of flexibility.
JS có đồng bộ theo mặc định không?JavaScript đồng bộ theo mặc định và là một luồng.Điều này có nghĩa là mã không thể tạo các luồng mới và chạy song song. and is single threaded. This means that code cannot create new threads and run in parallel.
Là JavaScript đồng bộ hay không đồng bộ bởi bản chất?JavaScript là một ngôn ngữ lập trình không đồng bộ và đồng thời mang lại nhiều sự linh hoạt nhưng cũng đồng thời là một luồng đơn và không chặn.Mặc dù bản chất nó đồng bộ, JavaScript có thể được hưởng lợi từ mã không đồng bộ.synchronous by nature, JavaScript can benefit from asynchronous code. |