JavaScript là đồng bộ hay không đồng bộ?
Khi sử dụng hàm JavaScript Show Thí dụsetTimeout(myFunction, 3000); hàm myFunction() { Tự mình thử » Trong ví dụ trên,
3000 là số mili giây trước khi hết thời gian, vì vậy Ghi chúKhi bạn chuyển một hàm làm đối số, hãy nhớ không sử dụng dấu ngoặc đơn Đúng. setTimeout(myFunction, 3000); Sai. setTimeout(myFunction(), 3000); Thay vì chuyển tên của một hàm làm đối số cho một hàm khác, thay vào đó, bạn luôn có thể chuyển toàn bộ hàm Thí dụsetTimeout(function() { myFunction("Anh yeu em. "); }, 3000); hàm myFunction(giá trị) { Tự mình thử » Trong ví dụ trên, 3000 là số mili giây trước khi hết thời gian, vì vậy Đang chờ khoảng thời gianKhi sử dụng hàm JavaScript Thí dụsetInterval(myFunction, 1000); hàm myFunction() { Tự mình thử » Trong ví dụ trên,
1000 là số mili giây giữa các khoảng thời gian, do đó, Các lựa chọn thay thế gọi lạiVới lập trình không đồng bộ, các chương trình JavaScript có thể bắt đầu các tác vụ chạy dài và tiếp tục chạy song song các tác vụ khác Tuy nhiên, các chương trình không đồng bộ rất khó viết và khó gỡ lỗi Do đó, hầu hết các phương thức JavaScript không đồng bộ hiện đại không sử dụng lệnh gọi lại. Thay vào đó, trong JavaScript, lập trình không đồng bộ được giải quyết bằng Promises Trong bài viết này, chúng tôi sẽ giải thích lập trình bất đồng bộ là gì, tại sao chúng tôi cần nó và thảo luận ngắn gọn về một số cách các chức năng không đồng bộ đã được triển khai trong lịch sử trong JavaScript điều kiện tiên quyết. Trình độ máy tính cơ bản, hiểu biết hợp lý về các nguyên tắc cơ bản của JavaScript, bao gồm các chức năng và trình xử lý sự kiện. Khách quan. Để làm quen với JavaScript không đồng bộ là gì, nó khác với JavaScript đồng bộ như thế nào và tại sao chúng ta cần nóLập trình không đồng bộ là một kỹ thuật cho phép chương trình của bạn bắt đầu một tác vụ có khả năng chạy dài và vẫn có thể phản hồi các sự kiện khác trong khi tác vụ đó chạy, thay vì phải đợi cho đến khi tác vụ đó kết thúc. Khi nhiệm vụ đó đã hoàn thành, chương trình của bạn sẽ hiển thị kết quả Nhiều chức năng do trình duyệt cung cấp, đặc biệt là những chức năng thú vị nhất, có thể mất nhiều thời gian và do đó, không đồng bộ. Ví dụ
Vì vậy, mặc dù bạn có thể không phải thực hiện các chức năng không đồng bộ của riêng mình thường xuyên, nhưng rất có thể bạn cần sử dụng chúng một cách chính xác Trong bài viết này, chúng ta sẽ bắt đầu bằng cách xem xét vấn đề với các hàm đồng bộ chạy dài, khiến cho việc lập trình không đồng bộ trở nên cần thiết Hãy xem xét đoạn mã sau
mã này
Chúng ta nên lưu ý ở đây rằng trình duyệt duyệt từng dòng một của chương trình một cách hiệu quả, theo thứ tự chúng ta đã viết nó. Tại mỗi điểm, trình duyệt đợi dòng hoàn thành công việc của nó trước khi chuyển sang dòng tiếp theo. Nó phải làm điều này bởi vì mỗi dòng phụ thuộc vào công việc được thực hiện trong các dòng trước Điều đó làm cho chương trình này trở thành một chương trình đồng bộ. Nó vẫn sẽ đồng bộ ngay cả khi chúng ta gọi một chức năng riêng biệt, như thế này
Ở đây, 8 là một hàm đồng bộ vì người gọi phải đợi hàm hoàn thành công việc và trả về một giá trị trước khi người gọi có thể tiếp tụcNếu chức năng đồng bộ mất nhiều thời gian thì sao? Chương trình bên dưới sử dụng thuật toán rất kém hiệu quả để tạo nhiều số nguyên tố lớn khi người dùng nhấp vào nút "Tạo số nguyên tố". Số lượng số nguyên tố do người dùng chỉ định càng cao thì thao tác sẽ càng mất nhiều thời gian
Hãy thử nhấp vào "Tạo số nguyên tố". Tùy thuộc vào tốc độ máy tính của bạn, có thể sẽ mất vài giây trước khi chương trình hiển thị thông báo "Đã hoàn tất. " thông điệp Ví dụ tiếp theo giống như ví dụ trước, ngoại trừ chúng tôi đã thêm một hộp văn bản để bạn nhập vào. Lần này, hãy nhấp vào "Tạo số nguyên tố" và thử nhập vào hộp văn bản ngay sau đó Bạn sẽ thấy rằng trong khi chức năng 9 của chúng tôi đang chạy, chương trình của chúng tôi hoàn toàn không phản hồi. bạn không thể nhập bất cứ thứ gì, nhấp vào bất cứ thứ gì hoặc làm bất cứ điều gì khác
Đây là vấn đề cơ bản với các chức năng đồng bộ chạy dài. Những gì chúng tôi cần là một cách để chương trình của chúng tôi
Đó chính xác là những gì các chức năng không đồng bộ có thể làm. Phần còn lại của mô-đun này giải thích cách chúng được triển khai trong JavaScript Mô tả mà chúng ta vừa thấy về các hàm không đồng bộ có thể nhắc bạn về các trình xử lý sự kiện và nếu đúng như vậy thì bạn đã đúng. Trình xử lý sự kiện thực sự là một dạng lập trình không đồng bộ. bạn cung cấp một chức năng (trình xử lý sự kiện) sẽ được gọi, không phải ngay lập tức mà bất cứ khi nào sự kiện xảy ra. Nếu "sự kiện" là "hoạt động không đồng bộ đã hoàn thành", thì sự kiện đó có thể được sử dụng để thông báo cho người gọi về kết quả của một lệnh gọi hàm không đồng bộ Một số API không đồng bộ ban đầu đã sử dụng các sự kiện theo cách này. API 0 cho phép bạn thực hiện các yêu cầu HTTP tới máy chủ từ xa bằng JavaScript. Vì quá trình này có thể mất nhiều thời gian, nên đây là một API không đồng bộ và bạn được thông báo về tiến độ và khả năng hoàn thành cuối cùng của một yêu cầu bằng cách đính kèm trình xử lý sự kiện vào đối tượng 0Ví dụ sau đây cho thấy điều này trong hành động. Nhấn "Click to start request" để gửi yêu cầu. Chúng tôi tạo một 0 mới và lắng nghe sự kiện 3 của nó. Trình xử lý ghi nhật ký "Đã hoàn tất. " thông báo cùng với mã trạng tháiSau khi thêm trình lắng nghe sự kiện, chúng tôi gửi yêu cầu. Lưu ý rằng sau này, chúng tôi có thể đăng nhập "Yêu cầu XHR đã bắt đầu". nghĩa là, chương trình của chúng tôi có thể tiếp tục chạy trong khi yêu cầu đang diễn ra và trình xử lý sự kiện của chúng tôi sẽ được gọi khi yêu cầu hoàn tất
Điều này giống như các trình xử lý sự kiện mà chúng ta đã gặp trong mô-đun trước, ngoại trừ việc thay vì sự kiện là hành động của người dùng, chẳng hạn như người dùng nhấp vào nút, thì sự kiện này là sự thay đổi trạng thái của một số đối tượng Trình xử lý sự kiện là một loại gọi lại cụ thể. Một cuộc gọi lại chỉ là một chức năng được truyền vào một chức năng khác, với mong muốn rằng cuộc gọi lại sẽ được gọi vào thời điểm thích hợp. Như chúng ta vừa thấy, các cuộc gọi lại từng là cách chính để triển khai các chức năng không đồng bộ trong JavaScript Tuy nhiên, mã dựa trên cuộc gọi lại có thể khó hiểu khi bản thân cuộc gọi lại phải gọi các hàm chấp nhận cuộc gọi lại. Đây là tình huống phổ biến nếu bạn cần thực hiện một số thao tác chia nhỏ thành một loạt các chức năng không đồng bộ. Ví dụ, hãy xem xét những điều sau đây 0Ở đây, chúng tôi có một thao tác được chia thành ba bước, trong đó mỗi bước phụ thuộc vào bước cuối cùng. Trong ví dụ của chúng tôi, bước đầu tiên thêm 1 vào đầu vào, bước thứ hai thêm 2 và bước thứ ba thêm 3. Bắt đầu với đầu vào là 0, kết quả cuối cùng là 6 (0 + 1 + 2 + 3). Là một chương trình đồng bộ, điều này rất đơn giản. Nhưng nếu chúng ta triển khai các bước bằng cách sử dụng lệnh gọi lại thì sao? 1Bởi vì chúng tôi phải gọi các cuộc gọi lại bên trong các cuộc gọi lại, chúng tôi nhận được một hàm 4 được lồng sâu, khó đọc và gỡ lỗi hơn nhiều. Điều này đôi khi được gọi là "địa ngục gọi lại" hoặc "kim tự tháp diệt vong" (vì vết lõm trông giống như một kim tự tháp trên mặt của nó)Khi chúng ta lồng các cuộc gọi lại như thế này, nó cũng có thể rất khó xử lý lỗi. thường thì bạn phải xử lý lỗi ở từng cấp của “kim tự tháp”, thay vì chỉ xử lý lỗi một lần ở cấp cao nhất Vì những lý do này, hầu hết các API không đồng bộ hiện đại không sử dụng lệnh gọi lại. Thay vào đó, nền tảng của lập trình bất đồng bộ trong JavaScript là 5, và đó là chủ đề của bài viết tiếp theo
JavaScript là phương tiện không đồng bộ hay đồng bộ?Phần giới thiệu. về cơ bản, JavaScript là một đồng bộ , chặn, ngôn ngữ đơn luồng. Điều đó chỉ có nghĩa là tại một thời điểm chỉ có một hoạt động có thể được tiến hành. Đó không phải là toàn bộ câu chuyện, mặc dù.
Chức năng JavaScript có không đồng bộ không?Nếu bạn đã học JavaScript được một thời gian, thì có lẽ bạn đã từng nghe thuật ngữ "không đồng bộ" trước đây. Điều này là do JavaScript là một ngôn ngữ không đồng bộ. Nhưng điều đó thực sự có ý nghĩa gì?
JavaScript nào không đồng bộ?Lập trình không đồng bộ là một kỹ thuật cho phép chương trình của bạn bắt đầu một tác vụ có khả năng chạy dài và vẫn có thể phản hồi các sự kiện khác trong khi tác vụ đó chạy, thay vì phải đợi cho đến khi tác vụ đó kết thúc. Khi nhiệm vụ đó đã hoàn thành, chương trình của bạn sẽ hiển thị kết quả
JavaScript không đồng bộ theo mặc định?JavaScript được đồng bộ theo mặc định và là luồng đơn. Điều này có nghĩa là mã không thể tạo chủ đề mới và nó sẽ thực thi khối mã của bạn theo thứ tự sau khi cẩu |