Rumah hujung hadapan web tutorial js 关于js中的同步和异步的理解

关于js中的同步和异步的理解

Apr 09, 2018 am 11:19 AM
javascript segerak tak segerak

本篇文章给大家分享的内容是关于js中的同步和异步的理解,有着一定的参考价值,有需要的朋友可以参考一下

你应该知道,javascript语言是一门“单线程”的语言,不像java语言,类继承Thread再来个thread.start就可以开辟一个线程,所以,javascript就像一条流水线,仅仅是一条流水线而已,要么加工,要么包装,不能同时进行多个任务和流程。

那么这里说的同步异步到底是什么呢?如果你真的不懂,我希望你认真读完这篇文章。其实我个人觉得js官方的文档在使用两个词的时候并不准确,包括很多其他词汇,都只是听起来高深,但实际应用好像跟这些词没半毛钱关系。例如“事件委托”这个词,不知道的人乍一看谁又能说出“事件委托”是什么意思?委托什么事件?怎么个委托,我看不如干脆就叫“事件在外层元素中的捕获”,虽然长一点,一下就能看懂。

回归正轨,“同步”——一下就让人想到“一起”这个词;“异步”呢,从字面来讲,好像是在不同的(异)的ways上do something,那首先想到的词可能是“一边...一边...”,比如‘小明一边吃雪糕一边写作业’,这完全没毛病,雪糕吃完了,作业也写完了,这就是异步?那就大错特错了!

其实同步和异步,无论如何,做事情的时候都是只有一条流水线(单线程),同步和异步的差别就在于这条流水线上各个流程的执行顺序不同

最基础的异步是setTimeout和setInterval函数,很常见,但是很少人有人知道其实这就是异步,因为它们可以控制js的执行顺序。我们也可以简单地理解为:可以改变程序正常执行顺序的操作就可以看成是异步操作。如下代码:

<script type="text/javascript">
        console.log( "1" );
        setTimeout(function() {
            console.log( "2" )
        }, 0 );
        setTimeout(function() {
            console.log( "3" )
        }, 0 );
        setTimeout(function() {
            console.log( "4" )
        }, 0 );
        console.log( "5" );
</script>
Salin selepas log masuk

输出顺序是什么呢?

可见,尽管我们设置了setTimeout(function,time)中的等待时间为0,结果其中的function还是后执行。

火狐浏览器的api文档有这样一句话:Because even though setTimeout was called with a delay of zero, it's placed on a queue and scheduled to run at the next opportunity, not immediately. Currently executing code must complete before functions on the queue are executed, the resulting execution order may not be as expected.

意思就是:尽管setTimeout的time延迟时间为0,其中的function也会被放入一个队列中,等待下一个机会执行,当前的代码(指不需要加入队列中的程序)必须在该队列的程序完成之前完成,因此结果可能不与预期结果相同。

这里说到了一个“队列”(即任务队列),该队列放的是什么呢,放的就是setTimeout中的function,这些function依次加入该队列,即该队列中所有function中的程序将会在该队列以外的所有代码执行完毕之后再以此执行,这是为什么呢?因为在执行程序的时候,浏览器会默认setTimeout以及ajax请求这一类的方法都是耗时程序(尽管可能不耗时),将其加入一个队列中,该队列是一个存储耗时程序的队列,在所有不耗时程序执行过后,再来依次执行该队列中的程序。

又回到了最初的起点——javascript是单线程。单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。于是就有一个概念——任务队列。如果排队是因为计算量大,CPU忙不过来,倒也算了,但是很多时候CPU是闲着的,因为IO设备(输入输出设备)很慢(比如Ajax操作从网络读取数据),不得不等着结果出来,再往下执行。于是JavaScript语言的设计者意识到,这时主线程完全可以不管IO设备,挂起处于等待中的任务,先运行排在后面的任务。等到IO设备返回了结果,再回过头,把挂起的任务继续执行下去。

于是,所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有等主线程任务执行完毕,"任务队列"开始通知主线程,请求执行任务,该任务才会进入主线程执行。

具体来说,异步运行机制如下:

(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
(2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
(4)主线程不断重复上面的第三步。

只要主线程空了,就会去读取"任务队列",这就是JavaScript的运行机制。这个过程会不断重复。  

"任务队列"是一个事件的队列(也可以理解成消息的队列),IO设备完成一项任务,就在"任务队列"中添加一个事件,表示相关的异步任务可以进入"执行栈"了。主线程读取"任务队列",就是读取里面有哪些事件。
"任务队列"中的事件,除了IO设备的事件以外,还包括一些用户产生的事件(比如鼠标点击、页面滚动等等),比如$(selectot).click(function),这些都是相对耗时的操作。只要指定过这些事件的回调函数,这些事件发生时就会进入"任务队列",等待主线程读取。
所谓"回调函数"(callback),就是那些会被主线程挂起来的代码,前面说的点击事件$(selectot).click(function)中的function就是一个回调函数。异步任务必须指定回调函数,当主线程开始执行异步任务,就是执行对应的回调函数。例如ajax的success,complete,error也都指定了各自的回调函数,这些函数就会加入“任务队列”中,等待执行。

相关推荐:

js同步和异步

JavaScript同步、异步、回调执行顺序分析

深入理解JavaScript编程中的同步与异步机制

Atas ialah kandungan terperinci 关于js中的同步和异步的理解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Selesaikan masalah memainkan fon kepala dan pembesar suara pada masa yang sama dalam win11 Selesaikan masalah memainkan fon kepala dan pembesar suara pada masa yang sama dalam win11 Jan 06, 2024 am 08:50 AM

Secara umumnya, kita hanya perlu menggunakan salah satu fon kepala atau pembesar suara pada masa yang sama Namun, beberapa rakan telah melaporkan bahawa dalam sistem win11, mereka menghadapi masalah fon kepala dan pembesar suara pada masa yang sama matikan dalam panel realtek dan ia akan baik-baik saja, mari lihat di bawah. Apakah yang perlu saya lakukan jika fon kepala dan pembesar suara saya berbunyi bersama dalam win11 1. Mula-mula cari dan buka "Panel Kawalan" pada desktop 2. Masukkan panel kawalan, cari dan buka "Perkakasan dan Bunyi" 3. Kemudian cari ". Realtek High Definition" dengan ikon pembesar suara. Pengurus Audio" 4. Pilih "Speaker" dan klik "Panel Belakang" untuk memasukkan tetapan pembesar suara. 5. Selepas membuka, kita dapat melihat jenis peranti Jika anda ingin mematikan fon kepala, nyahtanda "Fon Kepala".

Satu atau lebih item dalam folder yang anda segerakkan tidak sepadan dengan ralat Outlook Satu atau lebih item dalam folder yang anda segerakkan tidak sepadan dengan ralat Outlook Mar 18, 2024 am 09:46 AM

Apabila anda mendapati bahawa satu atau lebih item dalam folder penyegerakan anda tidak sepadan dengan mesej ralat dalam Outlook, ini mungkin disebabkan anda mengemas kini atau membatalkan item mesyuarat. Dalam kes ini, anda akan melihat mesej ralat yang mengatakan bahawa versi tempatan anda data bercanggah dengan salinan jauh. Keadaan ini biasanya berlaku dalam aplikasi desktop Outlook. Satu atau lebih item dalam folder yang anda segerakkan tidak sepadan. Untuk menyelesaikan konflik, buka projek dan cuba operasi semula. Betulkan Satu atau lebih item dalam folder yang disegerakkan tidak sepadan dengan ralat Outlook Dalam versi desktop Outlook, anda mungkin menghadapi masalah apabila item kalendar tempatan bercanggah dengan salinan pelayan. Nasib baik, walaupun, terdapat beberapa cara mudah untuk membantu

Ajar anda cara menyegerakkan papan keratan win10 dengan telefon mudah alih anda Ajar anda cara menyegerakkan papan keratan win10 dengan telefon mudah alih anda Jan 06, 2024 am 09:18 AM

Fungsi papan keratan win10 yang sangat berguna ialah fungsi storan awan merentas peranti, yang sangat berguna dan boleh membantu pengguna menyalin dan menampal secara serentak pada peranti PC dan peranti mudah alih. Kaedah tetapan adalah sangat mudah, cuma tetapkan pada papan keratan dalam sistem. Segerakkan papan keratan win10 ke telefon bimbit 1. Mula-mula klik Mula di sudut kiri bawah untuk memasukkan tetapan. 2. Kemudian klik "Sistem". 3. Pilih "Papan Klip" di sebelah kiri. 4. Akhir sekali, klik Log masuk dalam "Penyegerakan merentas peranti" di sebelah kanan, dan kemudian pilih telefon mudah alih anda.

Tutorial JavaScript Mudah: Cara Mendapatkan Kod Status HTTP Tutorial JavaScript Mudah: Cara Mendapatkan Kod Status HTTP Jan 05, 2024 pm 06:08 PM

Tutorial JavaScript: Bagaimana untuk mendapatkan kod status HTTP, contoh kod khusus diperlukan: Dalam pembangunan web, interaksi data dengan pelayan sering terlibat. Apabila berkomunikasi dengan pelayan, kami selalunya perlu mendapatkan kod status HTTP yang dikembalikan untuk menentukan sama ada operasi itu berjaya dan melaksanakan pemprosesan yang sepadan berdasarkan kod status yang berbeza. Artikel ini akan mengajar anda cara menggunakan JavaScript untuk mendapatkan kod status HTTP dan menyediakan beberapa contoh kod praktikal. Menggunakan XMLHttpRequest

Panduan Lanjutan untuk Python asyncio: Dari Pemula kepada Pakar Panduan Lanjutan untuk Python asyncio: Dari Pemula kepada Pakar Mar 04, 2024 am 09:43 AM

Pengaturcaraan Serentak dan Tak Segerak Pengaturcaraan serentak berurusan dengan berbilang tugas yang dilaksanakan secara serentak, pengaturcaraan tak segerak ialah sejenis pengaturcaraan serentak di mana tugasan tidak menyekat benang. asyncio ialah perpustakaan untuk pengaturcaraan tak segerak dalam python, yang membolehkan atur cara melaksanakan operasi I/O tanpa menyekat utas utama. Gelung peristiwa Teras asyncio ialah gelung peristiwa, yang memantau peristiwa I/O dan menjadualkan tugas yang sepadan. Apabila coroutine sedia, gelung acara melaksanakannya sehingga ia menunggu operasi I/O. Ia kemudian menjeda coroutine dan terus melaksanakan coroutine lain. Coroutines Coroutines ialah fungsi yang boleh menjeda dan menyambung semula pelaksanaan. Kata kunci asyncdef digunakan untuk membuat coroutine. Coroutine menggunakan kata kunci tunggu untuk menunggu operasi I/O selesai. Asas asyncio berikut

Bagaimana untuk mendapatkan kod status HTTP dalam JavaScript dengan cara yang mudah Bagaimana untuk mendapatkan kod status HTTP dalam JavaScript dengan cara yang mudah Jan 05, 2024 pm 01:37 PM

Pengenalan kepada kaedah mendapatkan kod status HTTP dalam JavaScript: Dalam pembangunan bahagian hadapan, kita selalunya perlu berurusan dengan interaksi dengan antara muka bahagian belakang, dan kod status HTTP adalah bahagian yang sangat penting daripadanya. Memahami dan mendapatkan kod status HTTP membantu kami mengendalikan data yang dikembalikan oleh antara muka dengan lebih baik. Artikel ini akan memperkenalkan cara menggunakan JavaScript untuk mendapatkan kod status HTTP dan memberikan contoh kod khusus. 1. Apakah kod status HTTP bermakna kod status HTTP apabila penyemak imbas memulakan permintaan kepada pelayan, perkhidmatan tersebut

Bagaimana untuk menyegerakkan cakera penyegerakan awan Baidu Bagaimana untuk menyegerakkan cakera penyegerakan awan Baidu Feb 23, 2024 pm 01:22 PM

Bagaimana untuk menyegerakkan Baidu Cloud Sync Disk? Anda boleh memilih fail untuk disegerakkan dalam Baidu Cloud Sync Disk, tetapi kebanyakan pengguna tidak tahu cara menyegerakkan fail Baidu Cloud Seterusnya ialah tutorial grafik kaedah penyegerakan Baidu Cloud Sync yang dibawa oleh editor untuk pengguna yang berminat datang dan lihat! Cara menyegerakkan Cakera Penyegerakan Awan Baidu 1. Mula-mula masukkan desktop komputer, klik kanan ikon [Baidu Cloud Sync Disk] dan pilih [Settings] 2. Kemudian kembangkan tetingkap perkhidmatan, tukar ke halaman [Advanced Settings] dan klik [Pilih Folder]; 3. Akhirnya beralih ke halaman di bawah, semak fail yang perlu disegerakkan dan klik [OK].

Kunci dan penyegerakan dalam pengaturcaraan serentak Python: memastikan kod anda selamat dan boleh dipercayai Kunci dan penyegerakan dalam pengaturcaraan serentak Python: memastikan kod anda selamat dan boleh dipercayai Feb 19, 2024 pm 02:30 PM

Kunci dan Penyegerakan dalam Pengaturcaraan Serentak Dalam pengaturcaraan serentak, berbilang proses atau utas berjalan serentak, yang boleh membawa kepada isu pertikaian sumber dan ketidakkonsistenan. Untuk menyelesaikan masalah ini, kunci dan mekanisme penyegerakan diperlukan untuk menyelaraskan akses kepada sumber yang dikongsi. Konsep Kunci Kunci ialah mekanisme yang membenarkan hanya satu utas atau proses mengakses sumber yang dikongsi pada satu masa. Apabila satu utas atau proses memperoleh kunci, utas atau proses lain disekat daripada mengakses sumber sehingga kunci dilepaskan. Jenis kunci Terdapat beberapa jenis kunci dalam ular sawa: Kunci Mutex (Mutex): memastikan bahawa hanya satu utas atau proses boleh mengakses sumber pada satu masa. Pembolehubah keadaan: Membenarkan benang atau proses menunggu keadaan tertentu dan kemudian memperoleh kunci. Kunci baca-tulis: membenarkan berbilang utas membaca sumber pada masa yang sama, tetapi hanya membenarkan satu utas menulis sumber

See all articles