天天看點

同步與異步的差別?

參考https://www.cnblogs.com/sun-web/p/10967361.html

(1)同步

同步的思想是:所有的操作都做完,才傳回給使用者。這樣使用者線上等待的時間太長,給使用者一種卡死了的感覺(就是系統遷移中,點選了遷移,界面就不動了,但是程式還在執行,卡死了的感覺)。這種情況下,使用者不能關閉界面,如果關閉了,即遷移程式就中斷了。

(2)異步

将使用者請求放入消息隊列,并回報給使用者,系統遷移程式已經啟動,你可以關閉浏覽器了。然後程式再慢慢地去寫入資料庫去。這就是異步。但是使用者沒有卡死的感覺,會告訴你,你的請求系統已經響應了。你可以關閉界面了。

同步和異步本身是相對的。同步就相當于是 當用戶端發送請求給服務端,在等待服務端響應的請求時,用戶端不做其他的事情。當服務端做完了才傳回到用戶端。這樣的話用戶端需要一直等待。使用者使用起來會有不友好。異步就是當用戶端發送給服務端請求時,在等待服務端響應的時候,用戶端可以做其他的事情,這樣節約了時間,提高了效率。存在就有其道理,異步雖然好,但是有些問題是要用同步用來解決,比如有些東西我們需要的是拿到傳回的資料在進行操作的。這些是異步所無法解決的。

這裡主要介紹web前端中如何實作異步程式設計。異步程式設計是前端通往全棧必須了解的知識點,各種異步程式設計解決方案層出不窮,外面使用各種方式的實作都有,我們如果要學習别人的代碼,就需要了解各種異步解決方案的原理和它們出現的原因,以及使用場景。web前端中如何實作異步程式設計。

同步與異步的差別?

我們常說JavaScript是單線程的,實際是指JS引擎中負責解釋和執行JavaScript代碼的線程隻有一個,不妨叫它主線程。與之對應的其他線程還有處理ajax的線程,定時器線程,讀寫檔案的線程(node.js)等,可以叫它們為工作線程。單線程工作是同步,跨線程工作會出現異步。異步的應用場景是需要執行比較耗時的操作,它的優點是由主線程發起後交給其他線程處理,不會阻塞主線程繼續執行後面的代碼,帶來的問題是主線程難以感覺其它線程處理的進度,其它線程處理完畢後需要通知主線程處理的結果,這個通知的方式我們之前一般采用的是回調。

同步與異步的差別?

實作異步僅僅是第一步,難點在于異步的處理結果通知,我們最終需要的是将異步代碼處理得像書寫同步代碼一樣直覺和簡潔,

如何實作異步程式設計?具體方法如下。

方法1 ,通過回調函數。優點是簡單、容易了解和部署· 缺點是不利于代碼的閱讀和維護,各個部分之間高度相合( Coupling ),流程混亂,而且每個任務隻能指定一個回調函數。

方法2 ,通過事件監聽。可以綁定多個事件,每個事件可以指定多個回調函數,而且可以“去搞合”( Decoupling ),有利于實作子產品化;缺點是整個程式都要變成事件驅動型,運作流程會變得很不清晰。

同步與異步的差別?

方法3 ,采用釋出/訂閱方式。性質與“事件監聽”類似, 但是明顯優于後者。

方法4 ,通過Promise 對象實作。Promise 對象是CommonJS 工作組提出的一種規範,旨在為異步程式設計提供統一接口。它的思想是,每一個異步任務傳回一個Promise 對象,該對象有一個then 方法,九許指定回調函數。