摘要:而是在調(diào)用發(fā)出后,被調(diào)用者通過(guò)狀態(tài)通知來(lái)通知調(diào)用者,或通過(guò)回調(diào)函數(shù)處理這個(gè)調(diào)用。請(qǐng)求程序發(fā)出請(qǐng)求,從服務(wù)器端獲取數(shù)據(jù),并設(shè)置了回調(diào)函數(shù)。然后,瀏覽器會(huì)設(shè)置偵聽(tīng)來(lái)自網(wǎng)絡(luò)的響應(yīng),拿到數(shù)據(jù)后,將該回調(diào)函數(shù)插入到事件循環(huán)。
并發(fā)與并行
并發(fā)是指兩個(gè)或多個(gè)事件鏈隨時(shí)間發(fā)展交替執(zhí)行,以至于從更高的層次來(lái)看,就像是同時(shí)運(yùn)行(但在任意時(shí)刻只處理一個(gè)事件)
并發(fā)的關(guān)鍵是你有處理多個(gè)任務(wù)的能力,不一定同時(shí)。
并行的關(guān)鍵是你有同時(shí)處理多個(gè)任務(wù)的能力。
并發(fā)和并行都可以是很多個(gè)線程,就看這些線程能不能同時(shí)被(多個(gè))cpu執(zhí)行,如果可以就說(shuō)明是并行,而并發(fā)是多個(gè)線程被(一個(gè))cpu 輪流切換著執(zhí)行。
區(qū)別:是否【同時(shí)】
單線程事件循環(huán)是并發(fā)的一種形式
并發(fā)的實(shí)現(xiàn)方式:多進(jìn)程,多線程,事件循環(huán)
我的理解是:并發(fā)是多個(gè)邏輯流交替執(zhí)行,看起來(lái)像是同時(shí)運(yùn)行,其實(shí)任意時(shí)刻只能處理一個(gè);而并行是真正的同時(shí)執(zhí)行。
同步與異步同步和異步關(guān)注的是消息通信機(jī)制 (synchronous communication/ asynchronous communication)
同步,就是在發(fā)出一個(gè)調(diào)用時(shí),在沒(méi)有得到結(jié)果之前,該調(diào)用就不返回。但是一旦調(diào)用返回,就得到返回值了。
異步則是相反,調(diào)用在發(fā)出之后,這個(gè)調(diào)用就直接返回了,所以沒(méi)有返回結(jié)果。換句話說(shuō),當(dāng)一個(gè)異步過(guò)程調(diào)用發(fā)出后,調(diào)用者不會(huì)立刻得到結(jié)果。而是在調(diào)用發(fā)出后,被調(diào)用者通過(guò)狀態(tài)、通知來(lái)通知調(diào)用者,或通過(guò)回調(diào)函數(shù)處理這個(gè)調(diào)用。
阻塞與非阻塞阻塞和非阻塞關(guān)注的是程序在等待調(diào)用結(jié)果(消息,返回值)時(shí)的狀態(tài)。
阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當(dāng)前線程會(huì)被掛起。調(diào)用線程只有在得到結(jié)果之后才會(huì)返回。
非阻塞調(diào)用指在不能立刻得到結(jié)果之前,該調(diào)用不會(huì)阻塞當(dāng)前線程。
我的理解:異步阻塞是沒(méi)有必要的;ajax請(qǐng)求最好不要設(shè)置為同步,chrome瀏覽器會(huì)警告
阻塞與非阻塞,同步與異步知乎鏈接
阻塞與非阻塞與是否同步異步無(wú)關(guān)
機(jī)制:while(true)每輪循環(huán)取出事件隊(duì)列中的隊(duì)頭事件執(zhí)行,事件隊(duì)列(先進(jìn)先出)。
setTimeout()是設(shè)定一個(gè)定時(shí)器,當(dāng)定時(shí)器到時(shí)后,環(huán)境會(huì)把回調(diào)函數(shù)放到事件循環(huán)中。如果此時(shí)事件隊(duì)列中有多個(gè)事件,那么該回調(diào)就會(huì)等待,所以setTimeout定時(shí)器的精度可能不高,只能確保回調(diào)函數(shù)不會(huì)在指定的時(shí)間間隔之前運(yùn)行。
AJAX請(qǐng)求:JS程序發(fā)出ajax請(qǐng)求,從服務(wù)器端獲取數(shù)據(jù),并設(shè)置了回調(diào)函數(shù)。發(fā)出請(qǐng)求的時(shí)候,JS引擎會(huì)通知宿主環(huán)境,讓其完成了網(wǎng)絡(luò)請(qǐng)求,拿到數(shù)據(jù)后執(zhí)行該回調(diào)函數(shù)。然后,瀏覽器會(huì)設(shè)置偵聽(tīng)來(lái)自網(wǎng)絡(luò)的響應(yīng),拿到數(shù)據(jù)后,將該回調(diào)函數(shù)插入到事件循環(huán)。
競(jìng)態(tài)條件:函數(shù)執(zhí)行順序的不確定性(來(lái)自于插入事件隊(duì)列順序的不確定性)
競(jìng)態(tài)條件可能會(huì)導(dǎo)致結(jié)果的不確定性,所以需要通過(guò)協(xié)調(diào)交互順序來(lái)解決這種情況。
并發(fā)協(xié)作:JS中我的理解是:將大任務(wù)分解為多個(gè)小任務(wù),分別利用異步機(jī)制插入到事件隊(duì)列中,例如可利用setTimeout(f,0)將小任務(wù)插入到事件隊(duì)列中,如果事件隊(duì)列目前有待執(zhí)行的事件就可以先執(zhí)行,以此來(lái)避免大任務(wù)阻塞事件隊(duì)列中其他任務(wù)的執(zhí)行。
JavaScript單線程與異步why單線程:作為瀏覽器腳本語(yǔ)言,JavaScript的主要用途是與用戶互動(dòng),以及操作DOM。這決定了它只能是單線程,否則會(huì)帶來(lái)很復(fù)雜的問(wèn)題。
why異步:我的理解:瀏覽器應(yīng)用決定了會(huì)有很多網(wǎng)絡(luò)請(qǐng)求,會(huì)有很多不可控的速度因素,瀏覽器是直接和用戶交互,用戶交互體驗(yàn)很重要,所以不能阻塞,但同步非阻塞處理起來(lái)會(huì)很麻煩,因?yàn)橥叫枰帉懘a去檢測(cè)任務(wù)是否執(zhí)行成功。所以就用異步,異步是通信機(jī)制決定了調(diào)用在發(fā)出之后就可以直接返回。
所有同步任務(wù)執(zhí)行完畢,系統(tǒng)就會(huì)循環(huán)讀取事件隊(duì)列。
阮一峰的鏈接:http://www.ruanyifeng.com/blo...
深入理解事件循環(huán)
深入事件循環(huán)
回調(diào)回調(diào)是JS中最基礎(chǔ)的異步模式
回調(diào)地獄:1)難以編寫,大腦的思維方式不適應(yīng)面向回調(diào)的異步代碼。2)為了處理可能出現(xiàn)的各種情況,只能在回調(diào)的每個(gè)步驟中硬編碼,造成代碼的復(fù)雜與重復(fù),難以重用和維護(hù)。
信任問(wèn)題:控制反轉(zhuǎn),即把自己程序的一部分執(zhí)行控制交給了某個(gè)第三方。
高階函數(shù)JS作為一門完整的面向?qū)ο蟮木幊陶Z(yǔ)言,借鑒了函數(shù)式語(yǔ)言的特性,比如閉包、高階函數(shù)等。
高階函數(shù): 函數(shù)可作為參數(shù)被傳遞,函數(shù)可作為返回值輸出。
函數(shù)作為參數(shù)被傳遞:
1)回調(diào)函數(shù),即將變化部分的代碼封裝為函數(shù),將函數(shù)作為參數(shù)傳遞。本來(lái)可以將變化的部分抽離出來(lái),形成兩個(gè)函數(shù),但實(shí)際上這兩個(gè)函數(shù)有依賴關(guān)系,所以只能參數(shù)調(diào)用,放到同一個(gè)函數(shù)中執(zhí)行。
2)Array.prototype.sort 可以傳入函數(shù)作為排序規(guī)則。
JS調(diào)試最好使用斷點(diǎn),因?yàn)閏onsole.log()是由宿主環(huán)境添加到JS中,控制臺(tái)I/O處理可能會(huì)有延時(shí)。
《你不知道的javascript中卷》第二部分異步和性能 1.1 異步控制臺(tái)部分:
并沒(méi)有什么規(guī)范或一組需求指定console.* 方法族如何工作——它們并不是JavaScript 正式
的一部分,而是由宿主環(huán)境(請(qǐng)參考本書的“類型和語(yǔ)法”部分)添加到JavaScript 中的。因此,不同的瀏覽器和JavaScript 環(huán)境可以按照自己的意愿來(lái)實(shí)現(xiàn),有時(shí)候這會(huì)引起混淆。
尤其要提出的是,在某些條件下,某些瀏覽器的console.log(..) 并不會(huì)把傳入的內(nèi)容立即輸出。出現(xiàn)這種情況的主要原因是,在許多程序(不只是JavaScript)中,I/O 是非常低速的阻塞部分。所以,(從頁(yè)面/UI 的角度來(lái)說(shuō))瀏覽器在后臺(tái)異步處理控制臺(tái)I/O 能夠提高性能,這時(shí)用戶甚至可能根本意識(shí)不到其發(fā)生。
例如在mousemove監(jiān)聽(tīng)函數(shù)中console.log,是不會(huì)打印出內(nèi)容的(mousemove觸發(fā)太頻繁,而console.log屬于I/O操作,瀏覽器為了性能考慮,會(huì)將這種頻繁I/O放到后臺(tái)運(yùn)行)。
解決方案: 如果斷點(diǎn)調(diào)試不方便的話,可以將需要打印的內(nèi)容,掛載到window對(duì)象,mousemove完成后再打印出來(lái)看。
更多博客: https://github.com/Lmagic16/blog
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/98363.html
摘要:項(xiàng)目開發(fā)準(zhǔn)備描述項(xiàng)目技術(shù)選型接口接口文檔測(cè)試接口啟動(dòng)項(xiàng)目開發(fā)使用腳手架創(chuàng)建項(xiàng)目開發(fā)環(huán)境運(yùn)行生產(chǎn)環(huán)境打包運(yùn)行管理項(xiàng)目創(chuàng)建遠(yuǎn)程倉(cāng)庫(kù)創(chuàng)建本地倉(cāng)庫(kù)配置將本地倉(cāng)庫(kù)推送到遠(yuǎn)程倉(cāng)庫(kù)在本地創(chuàng)建分支并推送到遠(yuǎn)程如果本地有修改新的同事克隆倉(cāng)庫(kù)如果遠(yuǎn)程修 day01 1. 項(xiàng)目開發(fā)準(zhǔn)備 1). 描述項(xiàng)目 2). 技術(shù)選型 3). API接口/接口文檔/測(cè)試接口 2. 啟動(dòng)項(xiàng)目開發(fā) 1). 使用react...
摘要:在處理異步回調(diào)函數(shù)的情況有著越來(lái)越值得推崇的方法及類庫(kù),下面會(huì)依次介紹處理異步函數(shù)的發(fā)展史,及源碼解讀。而對(duì)象的狀態(tài),是由第一個(gè)的參數(shù)成功回調(diào)函數(shù)或失敗回調(diào)函數(shù)的返回值決定的。 函數(shù)的執(zhí)行分為同步和異步兩種。同步即為 同步連續(xù)執(zhí)行,通俗點(diǎn)講就是做完一件事,再去做另一件事。異步即為 先做一件事,中間可以去做其他事情,稍后再回來(lái)做第一件事情。同時(shí)還要記住兩個(gè)特性:1.異步函數(shù)是沒(méi)有返回值的...
摘要:函數(shù)并不是生成器協(xié)程函數(shù)自動(dòng)執(zhí)行的唯一方案。因?yàn)樽詣?dòng)執(zhí)行的關(guān)鍵是,必須有一種機(jī)制,自動(dòng)控制生成器協(xié)程函數(shù)的流程,接收和交還程序的執(zhí)行權(quán)。回調(diào)函數(shù)可以做到這一點(diǎn),對(duì)象也可以做到這一點(diǎn)。本系列的下一篇,將介紹基于的實(shí)現(xiàn)的自動(dòng)執(zhí)行器。 PHP下的異步嘗試系列 如果你還不太了解PHP下的生成器和協(xié)程,你可以根據(jù)下面目錄翻閱 PHP下的異步嘗試一:初識(shí)生成器 PHP下的異步嘗試二:初識(shí)協(xié)程 P...
摘要:以及異步代碼在中是特別常見(jiàn)的,我們?cè)撛趺醋霾疟容^無(wú)法捕獲的情況這段代碼中,的回調(diào)函數(shù)拋出一個(gè)錯(cuò)誤,并不會(huì)在中捕獲,會(huì)導(dǎo)致程序直接報(bào)錯(cuò)崩掉。用捕獲異步錯(cuò)誤把異步操作用包裝,通過(guò)內(nèi)部判斷,把錯(cuò)誤,在外面通過(guò)捕獲。 引入 我們都知道 try catch 無(wú)法捕獲 setTimeout 異步任務(wù)中的錯(cuò)誤,那其中的原因是什么。以及異步代碼在 js 中是特別常見(jiàn)的,我們?cè)撛趺醋霾疟容^? 無(wú)法捕獲的...
摘要:異步編程在傳統(tǒng)編程實(shí)踐中,大多數(shù)操作都是同步發(fā)生的。中的異步編程異步是一種輸入輸出處理的形式,它允許在傳輸完成之前,其它處理能繼續(xù)進(jìn)行。 本文轉(zhuǎn)載自:眾成翻譯譯者:網(wǎng)絡(luò)埋伏紀(jì)事鏈接:http://www.zcfy.cc/article/1759原文:https://blog.risingstack.com/node-hero-async-programming-in-node-js/ ...
閱讀 3532·2021-10-09 09:41
閱讀 2739·2021-10-08 10:18
閱讀 2174·2021-09-10 10:51
閱讀 2674·2021-09-10 10:50
閱讀 771·2021-09-09 09:33
閱讀 3377·2021-09-06 15:14
閱讀 3011·2019-08-30 11:06
閱讀 3241·2019-08-29 14:04