成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

JS—異步、回調(diào)、高階函數(shù)

Dean / 2864人閱讀

摘要:而是在調(diào)用發(fā)出后,被調(diào)用者通過狀態(tài)通知來通知調(diào)用者,或通過回調(diào)函數(shù)處理這個調(diào)用。請求程序發(fā)出請求,從服務器端獲取數(shù)據(jù),并設置了回調(diào)函數(shù)。然后,瀏覽器會設置偵聽來自網(wǎng)絡的響應,拿到數(shù)據(jù)后,將該回調(diào)函數(shù)插入到事件循環(huán)。

并發(fā)與并行

并發(fā)是指兩個或多個事件鏈隨時間發(fā)展交替執(zhí)行,以至于從更高的層次來看,就像是同時運行(但在任意時刻只處理一個事件)

并發(fā)的關(guān)鍵是你有處理多個任務的能力,不一定同時。

并行的關(guān)鍵是你有同時處理多個任務的能力。

并發(fā)和并行都可以是很多個線程,就看這些線程能不能同時被(多個)cpu執(zhí)行,如果可以就說明是并行,而并發(fā)是多個線程被(一個)cpu 輪流切換著執(zhí)行。

區(qū)別:是否【同時】

單線程事件循環(huán)是并發(fā)的一種形式

并發(fā)的實現(xiàn)方式:多進程,多線程,事件循環(huán)

我的理解是:并發(fā)是多個邏輯流交替執(zhí)行,看起來像是同時運行,其實任意時刻只能處理一個;而并行是真正的同時執(zhí)行。

同步與異步

同步和異步關(guān)注的是消息通信機制 (synchronous communication/ asynchronous communication)

同步,就是在發(fā)出一個調(diào)用時,在沒有得到結(jié)果之前,該調(diào)用就不返回。但是一旦調(diào)用返回,就得到返回值了。

異步則是相反,調(diào)用在發(fā)出之后,這個調(diào)用就直接返回了,所以沒有返回結(jié)果。換句話說,當一個異步過程調(diào)用發(fā)出后,調(diào)用者不會立刻得到結(jié)果。而是在調(diào)用發(fā)出后,被調(diào)用者通過狀態(tài)、通知來通知調(diào)用者,或通過回調(diào)函數(shù)處理這個調(diào)用。

阻塞與非阻塞

阻塞和非阻塞關(guān)注的是程序在等待調(diào)用結(jié)果(消息,返回值)時的狀態(tài)。

阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當前線程會被掛起。調(diào)用線程只有在得到結(jié)果之后才會返回。

非阻塞調(diào)用指在不能立刻得到結(jié)果之前,該調(diào)用不會阻塞當前線程。

我的理解:異步阻塞是沒有必要的;ajax請求最好不要設置為同步,chrome瀏覽器會警告

阻塞與非阻塞,同步與異步知乎鏈接
阻塞與非阻塞與是否同步異步無關(guān)

事件循環(huán)

機制:while(true)每輪循環(huán)取出事件隊列中的隊頭事件執(zhí)行,事件隊列(先進先出)。

setTimeout()是設定一個定時器,當定時器到時后,環(huán)境會把回調(diào)函數(shù)放到事件循環(huán)中。如果此時事件隊列中有多個事件,那么該回調(diào)就會等待,所以setTimeout定時器的精度可能不高,只能確?;卣{(diào)函數(shù)不會在指定的時間間隔之前運行。

AJAX請求:JS程序發(fā)出ajax請求,從服務器端獲取數(shù)據(jù),并設置了回調(diào)函數(shù)。發(fā)出請求的時候,JS引擎會通知宿主環(huán)境,讓其完成了網(wǎng)絡請求,拿到數(shù)據(jù)后執(zhí)行該回調(diào)函數(shù)。然后,瀏覽器會設置偵聽來自網(wǎng)絡的響應,拿到數(shù)據(jù)后,將該回調(diào)函數(shù)插入到事件循環(huán)。

競態(tài)條件:函數(shù)執(zhí)行順序的不確定性(來自于插入事件隊列順序的不確定性)

競態(tài)條件可能會導致結(jié)果的不確定性,所以需要通過協(xié)調(diào)交互順序來解決這種情況。

并發(fā)協(xié)作:JS中我的理解是:將大任務分解為多個小任務,分別利用異步機制插入到事件隊列中,例如可利用setTimeout(f,0)將小任務插入到事件隊列中,如果事件隊列目前有待執(zhí)行的事件就可以先執(zhí)行,以此來避免大任務阻塞事件隊列中其他任務的執(zhí)行。

JavaScript單線程與異步

why單線程:作為瀏覽器腳本語言,JavaScript的主要用途是與用戶互動,以及操作DOM。這決定了它只能是單線程,否則會帶來很復雜的問題。

why異步:我的理解:瀏覽器應用決定了會有很多網(wǎng)絡請求,會有很多不可控的速度因素,瀏覽器是直接和用戶交互,用戶交互體驗很重要,所以不能阻塞,但同步非阻塞處理起來會很麻煩,因為同步需要編寫代碼去檢測任務是否執(zhí)行成功。所以就用異步,異步是通信機制決定了調(diào)用在發(fā)出之后就可以直接返回。

所有同步任務執(zhí)行完畢,系統(tǒng)就會循環(huán)讀取事件隊列。

阮一峰的鏈接:http://www.ruanyifeng.com/blo...

深入理解事件循環(huán)

深入事件循環(huán)

回調(diào)

回調(diào)是JS中最基礎的異步模式

回調(diào)地獄:1)難以編寫,大腦的思維方式不適應面向回調(diào)的異步代碼。2)為了處理可能出現(xiàn)的各種情況,只能在回調(diào)的每個步驟中硬編碼,造成代碼的復雜與重復,難以重用和維護。

信任問題:控制反轉(zhuǎn),即把自己程序的一部分執(zhí)行控制交給了某個第三方。

高階函數(shù)

JS作為一門完整的面向?qū)ο蟮木幊陶Z言,借鑒了函數(shù)式語言的特性,比如閉包、高階函數(shù)等。

高階函數(shù): 函數(shù)可作為參數(shù)被傳遞,函數(shù)可作為返回值輸出。

函數(shù)作為參數(shù)被傳遞:

1)回調(diào)函數(shù),即將變化部分的代碼封裝為函數(shù),將函數(shù)作為參數(shù)傳遞。本來可以將變化的部分抽離出來,形成兩個函數(shù),但實際上這兩個函數(shù)有依賴關(guān)系,所以只能參數(shù)調(diào)用,放到同一個函數(shù)中執(zhí)行。
2)Array.prototype.sort 可以傳入函數(shù)作為排序規(guī)則。

異步控制臺

JS調(diào)試最好使用斷點,因為console.log()是由宿主環(huán)境添加到JS中,控制臺I/O處理可能會有延時。

《你不知道的javascript中卷》第二部分異步和性能 1.1 異步控制臺部分:

并沒有什么規(guī)范或一組需求指定console.* 方法族如何工作——它們并不是JavaScript 正式
的一部分,而是由宿主環(huán)境(請參考本書的“類型和語法”部分)添加到JavaScript 中的。因此,不同的瀏覽器和JavaScript 環(huán)境可以按照自己的意愿來實現(xiàn),有時候這會引起混淆。

尤其要提出的是,在某些條件下,某些瀏覽器的console.log(..) 并不會把傳入的內(nèi)容立即輸出。出現(xiàn)這種情況的主要原因是,在許多程序(不只是JavaScript)中,I/O 是非常低速的阻塞部分。所以,(從頁面/UI 的角度來說)瀏覽器在后臺異步處理控制臺I/O 能夠提高性能,這時用戶甚至可能根本意識不到其發(fā)生。

例如在mousemove監(jiān)聽函數(shù)中console.log,是不會打印出內(nèi)容的(mousemove觸發(fā)太頻繁,而console.log屬于I/O操作,瀏覽器為了性能考慮,會將這種頻繁I/O放到后臺運行)。

解決方案: 如果斷點調(diào)試不方便的話,可以將需要打印的內(nèi)容,掛載到window對象,mousemove完成后再打印出來看。

更多博客: https://github.com/Lmagic16/blog

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/98363.html

相關(guān)文章

  • 尚學堂 react -后臺管理系統(tǒng)開發(fā)流程

    摘要:項目開發(fā)準備描述項目技術(shù)選型接口接口文檔測試接口啟動項目開發(fā)使用腳手架創(chuàng)建項目開發(fā)環(huán)境運行生產(chǎn)環(huán)境打包運行管理項目創(chuàng)建遠程倉庫創(chuàng)建本地倉庫配置將本地倉庫推送到遠程倉庫在本地創(chuàng)建分支并推送到遠程如果本地有修改新的同事克隆倉庫如果遠程修 day01 1. 項目開發(fā)準備 1). 描述項目 2). 技術(shù)選型 3). API接口/接口文檔/測試接口 2. 啟動項目開發(fā) 1). 使用react...

    lemon 評論0 收藏0
  • js處理異步函數(shù):從callback到promise

    摘要:在處理異步回調(diào)函數(shù)的情況有著越來越值得推崇的方法及類庫,下面會依次介紹處理異步函數(shù)的發(fā)展史,及源碼解讀。而對象的狀態(tài),是由第一個的參數(shù)成功回調(diào)函數(shù)或失敗回調(diào)函數(shù)的返回值決定的。 函數(shù)的執(zhí)行分為同步和異步兩種。同步即為 同步連續(xù)執(zhí)行,通俗點講就是做完一件事,再去做另一件事。異步即為 先做一件事,中間可以去做其他事情,稍后再回來做第一件事情。同時還要記住兩個特性:1.異步函數(shù)是沒有返回值的...

    dance 評論0 收藏0
  • PHP下的異步嘗試三:協(xié)程的PHP版thunkify自動執(zhí)行器

    摘要:函數(shù)并不是生成器協(xié)程函數(shù)自動執(zhí)行的唯一方案。因為自動執(zhí)行的關(guān)鍵是,必須有一種機制,自動控制生成器協(xié)程函數(shù)的流程,接收和交還程序的執(zhí)行權(quán)?;卣{(diào)函數(shù)可以做到這一點,對象也可以做到這一點。本系列的下一篇,將介紹基于的實現(xiàn)的自動執(zhí)行器。 PHP下的異步嘗試系列 如果你還不太了解PHP下的生成器和協(xié)程,你可以根據(jù)下面目錄翻閱 PHP下的異步嘗試一:初識生成器 PHP下的異步嘗試二:初識協(xié)程 P...

    wudengzan 評論0 收藏0
  • JS 異步錯誤捕獲二三事

    摘要:以及異步代碼在中是特別常見的,我們該怎么做才比較無法捕獲的情況這段代碼中,的回調(diào)函數(shù)拋出一個錯誤,并不會在中捕獲,會導致程序直接報錯崩掉。用捕獲異步錯誤把異步操作用包裝,通過內(nèi)部判斷,把錯誤,在外面通過捕獲。 引入 我們都知道 try catch 無法捕獲 setTimeout 異步任務中的錯誤,那其中的原因是什么。以及異步代碼在 js 中是特別常見的,我們該怎么做才比較? 無法捕獲的...

    Java_oldboy 評論0 收藏0
  • 【Node Hero】3. 理解異步編程

    摘要:異步編程在傳統(tǒng)編程實踐中,大多數(shù)操作都是同步發(fā)生的。中的異步編程異步是一種輸入輸出處理的形式,它允許在傳輸完成之前,其它處理能繼續(xù)進行。 本文轉(zhuǎn)載自:眾成翻譯譯者:網(wǎng)絡埋伏紀事鏈接:http://www.zcfy.cc/article/1759原文:https://blog.risingstack.com/node-hero-async-programming-in-node-js/ ...

    kevin 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<