非同步(Asynchronous)與同步(Synchronous)的差異

Elsa Wang
4 min readDec 12, 2015

--

開頭先來閒聊一下,其實我原本的標題是想打「那些年我一直分不清楚的同步與非同步」,想說模仿一下「那些年,我們一起追的女孩」。但後來還是覺得標題還是正經一點好了。免得大家以為我是個不正經的人!

會想要寫這篇文章的原因是因為,我有好長一段時間誤解了Async與Sync的意思,這段時間長到我想要認真糾正自己的誤解時,竟然想到頭都痛了。才發現要把存放在腦海很久的資訊,完全更新是很困難的一件事。所以希望透過寫Blog的方式,將Async與Sync的意思再重新整理並記錄,協助自己搞清楚Aysnc與Sync,也希望透過分享的方式,讓更多曾經和我一樣搞不清楚Async 與Sync的人,可以真正了解差異在哪裡。

現在要來解釋一下為何當初的自己會一直搞不清楚Async與Sync,現在工作的語言是Node.js,Node.js的特異就是以Async的方式處理需求。當初在撰寫程式的時候會遇到一個情況是,我需要完成A這件事,才可以進行B這件事,那在當時的時候,公司的同事是使用Async這個套件來完成上述的流程,而我也跟著使用這個套件。雖說是使用這個套件,但實際上只有使用Async.series來做流程控制而已,當時候我也沒有認真的看Async這個套件裡面的內容,所以我當時一直認為Async.series就是Async,然後又很傻的自己腦補,那我在寫Node.js中竟然要額外使用到Async套件的話,那就表示Node.js本身是Sync囉!
是的你沒有看錯,我就是這麼蠢的認為Node.js是用Sync來處理需求,這樣的想法跟了我幾個月後就被推翻了……

被推翻的原因是因為跟他人討論到Javascript的預設是Sync的,而Node.js則是非Async。等等等!! 這怎麼會跟我想的不一樣呢???? Node.js不應該是Sync才對嗎?! 這時候是第一次矯正錯誤觀念,所以此時我的腦袋就存在著自己誤解和更正後的正解。 但此次矯正的只是對Node.js的認知錯誤而已,針對Async與Sync的認知還是沒有真正的糾正過來,是一直到最近覺得自己不能每次想Async與Sync都要想很久,應該要非常清楚兩者差異才行,才真正對Async與Sync有所了解。

這時候又要說一下自己對Async與Sync的錯誤理解趴兔,經過整理後我以為是這樣子的。

Async 是一種圍毆的概念,大家一起打一個人。
Sync 是A打人 → B打 → C打 → D打

但其實不然呀….(怎麼覺得自己一直在理解錯誤呀=__=)

我在Slack中丟出這句我整理後的句子後,馬上接收到以下的說法
「Async的說法之所以沒有錯誤是因為 Async 的特性,所以可以做到圍毆的效果,但不是這並非Async 的本質。」

以下用對話來顯示

我:特性是指同時做很多事嗎?
W:async = 發出要求~收到結果 這中間我可以去做其他事情
W:你填好單子送到櫃檯,然後……
W:他辦完再叫你的號碼→Async
W:要站在櫃檯等他辦完→Sync
W:因為不用站在櫃檯等,你就可以跑很多櫃檯、送很多張單子出去,
就有上面說的「圍毆」的效果。
W:所以 sync/async 是在說單一櫃檯辦事員的運作模式。
W:然後……
W:在對方是 async 的前提下,有些事情還是要依序辦理,
例如:先去開好戶頭,才把戶頭交給公司行政。
W:那你腦內就要有個清單:
W:等薪資戶開好,然後再去跟公司行政帳號。
W:這個然後就是 promise 的 then
W:再歸納一次:
W:- sync/async 是指單一個要求or操作的運作方式。
(你需不需要卡住等他做完)
W:- promise 則是用來描述多個操作之間關係的方法。
(可以應付 async,但也可以是 sync)
W:以上

我不是偷懶直接貼對話而來,而是我真心覺得厲害,竟然透過這幾句話,就將我自己之前的錯誤觀念都糾正,而且又舉的例子又是非常淺顯易懂的!會這麼說是因為,我在這之前已經翻過很多在解釋Async與Sync的文章了,但看完我還是不太懂。(說不定是自己理解能力失調了)

所以來總結一下自己的總共犯了哪些錯誤,並加以更正!

Node.js的處理方式是Sync(x)
Node.js的處理方式是Async(0)

Async是一次處理很多需求(x)
Async是接收到需求,不用一直等到需求完成再執行其他需求(0)

Async與Sync的差別在於:發送需求的人是否需要等到需求完成才可以執行其他事情。

以上就是Async與Sync差異的介紹,希望這篇文章可以幫到所有曾經和我一樣搞不清楚Async與Sync的人!

--

--