js面試過程中遇到的非同步問題
js中的巨集任務與微任務
(推薦教學:js教學)
在面試過程中,基本面試官都會問你一些promise的問題,promise是es6的新內容,主要是用來優化非同步的問題。筆試中常常會讓你寫一些promise和setTimeout的執行結果,這你就必須知道宏任務和微任務的概念了!
為什麼要使用promise
如果你經歷過以前的jquery開發項目,你會遇到以下問題:回呼地獄
$.ajax({ ... success: function() { ... $.ajax({ ... success: function() { } }) ... } })
原因分析:
ajax請求嵌套,原因是我第二個請求依賴的參數在第一個請求的結果中,所以就得這麼一直嵌套下去,ajax是異步的,不能再外面拿到裡面的結果。這種程式碼導致的問題就是調試困難,耦合性非常高,後期改動一個地方就頭痛!維護非常困難,程式碼可讀性差。
於是乎就引入了promise對ajax進行了優化,axios就是基於promise的一個請求封裝庫,他們底層都是基於js原生的XMLHTTPREQUEST.
promise().then().catch()鏈式調用,多個請求可以promise().then().then()。
何為巨集任務,何為微任務?
思考這個問題時你必須知道javascript是一種單執行緒的腳本語言,也就是它的程式碼正常只能從上往下依序執行,一次只能做一件事,非同步是透過回呼函數來實現的。為何不把js設計成多執行緒的語言呢?語言的用途決定了它的特性,js最初是用來做表單驗證以及正規判斷的,和操作DOM元素的。如果js有多個線程,一個執行DOM元素修改,另一個執行刪除,那瀏覽器直接懵逼了,我到底該做啥? ? ?所以語言的用途決定了他的特性,但是瀏覽器是多執行緒的,除了主執行緒還有其他執行緒。
當js主程式執行時,先執行主程式上的同步程式碼,遇到setTimeout或setInterval就把它放入巨集佇列中,遇到promise的回呼就把它放到微佇列中,程式執行先執行主程式碼,再執行nextTick程式碼,然後微任務,最後巨集任務,任務佇列中的依序排隊執行,async和await是配套使用的,await後面接一個promise對象,來看看下面這段程式碼:
setTimeout(function(){console.log(1)},0); // 进入宏任务队列,最后执行宏任务 new Promise(function(resolve,reject){ console.log(2); //这句代码在promise构造器,同步执行 resolve(); // 执行了resolve再把任务放入微队列 }).then(function(){console.log(3) }).then(function(){console.log(4)}); process.nextTick(function(){console.log(5)}); console.log(6); // 主程序代码 // 输出2,6,5,3,4,1 // 下面这个进阶代码 setTimeout(function(){console.log(1)},0); // 进入宏任务排序为1 new Promise(function(resolve,reject){ console.log(2); // promise中执行完resolve()才会执行then(),而这里的resolve在宏任务里,执行完主程序代码后,还得先执行先进入宏队列中的程序 setTimeout(function(){resolve()},0) // 进入宏任务排序为2 }).then(function(){console.log(3) }).then(function(){console.log(4)}); process.nextTick(function(){console.log(5)}); console.log(6); // 输出的是 2 6 5 1 3 4
再看async and await中的執行順序
程式碼如下(範例):
async function async1() { console.log(1); await async2(); console.log(2); //这里要等await执行成功才会执行,进入微任务,排序1 } async function async2() { console.log(3); } console.log(4); //主程序代码 setTimeout(function() { console.log(5); }, 0) //进入宏任务,最后执行 async1(); new Promise(function(resolve) { console.log(6); // 这句同步执行 resolve(); }).then(function() { console.log(7); //进入微任务,排序2 }); console.log(8); // 主程序代码 // 输出的是 4,1,3,6,8,2,7,5
總結
js是單執行緒語言,它的用途決定了他的特性,非同步操作通過事件循環機制,先執行同步程式碼,然後微任務,最後宏任務,兩個任務佇列裡的任務排隊依序執行。 await後面的程式碼必須等待promise回傳結果再執行下面程式碼,await和async是generator函數的語法糖。
以上是js面試過程中遇到的非同步問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

人臉偵測辨識技術已經是一個比較成熟且應用廣泛的技術。而目前最廣泛的網路應用語言非JS莫屬,在Web前端實現人臉偵測辨識相比後端的人臉辨識有優勢也有弱勢。優點包括減少網路互動、即時識別,大大縮短了使用者等待時間,提高了使用者體驗;弱勢是:受到模型大小限制,其中準確率也有限。如何在web端使用js實現人臉偵測呢?為了實現Web端人臉識別,需要熟悉相關的程式語言和技術,如JavaScript、HTML、CSS、WebRTC等。同時也需要掌握相關的電腦視覺和人工智慧技術。值得注意的是,由於Web端的計

如何使用PHP和JS創建股票蠟燭圖股票蠟燭圖是股票市場中常見的技術分析圖形,透過繪製股票的開盤價、收盤價、最高價和最低價等數據,幫助投資者更直觀地了解股票的價格波動情形。本文將教你如何使用PHP和JS創建股票蠟燭圖,並附上具體的程式碼範例。一、準備工作在開始之前,我們需要準備以下環境:1.一台運行PHP的伺服器2.一個支援HTML5和Canvas的瀏覽器3

股票分析必備工具:學習PHP和JS繪製蠟燭圖的步驟,需要具體程式碼範例隨著網路和科技的快速發展,股票交易已成為許多投資者的重要途徑之一。而股票分析是投資人決策的重要一環,其中蠟燭圖被廣泛應用於技術分析。學習如何使用PHP和JS繪製蠟燭圖將為投資者提供更多直觀的信息,幫助他們更好地做出決策。蠟燭圖是一種以蠟燭形狀來展示股票價格的技術圖表。它展示了股票價格的

隨著網路金融的快速發展,股票投資已經成為了越來越多人的選擇。而在股票交易中,蠟燭圖是常用的技術分析方法,它能夠顯示股票價格的變動趨勢,幫助投資人做出更精準的決策。本文將透過介紹PHP和JS的開發技巧,帶領讀者了解如何繪製股票蠟燭圖,並提供具體的程式碼範例。一、了解股票蠟燭圖在介紹如何繪製股票蠟燭圖之前,我們首先需要先了解什麼是蠟燭圖。蠟燭圖是由日本人

js和vue的關係:1、JS作為Web開發基石;2、Vue.js作為前端框架的崛起;3、JS與Vue的互補關係;4、JS與Vue的實踐應用。

並發和非同步編程並發編程處理同時執行的多個任務,非同步編程是一種並發編程,其中任務不會阻塞線程。 asyncio是python中用於非同步程式設計的函式庫,它允許程式在不阻塞主執行緒的情況下執行I/O操作。事件循環asyncio的核心是事件循環,它監控I/O事件並調度相應的任務。當一個協程準備好時,事件循環會執行它,直到它等待I/O操作。然後,它會暫停協程並繼續執行其他協程。協程協程是可暫停和恢復執行的函數。 asyncdef關鍵字用於建立協程。協程使用await關鍵字等待I/O作業完成。 asyncio的基礎以下

Go框架是一組擴充Go內建程式庫的元件,提供預製功能(例如網路開發和資料庫操作)。受歡迎的Go框架包括Gin(Web開發)、GORM(資料庫操作)和RESTful(API管理)。中間件是HTTP請求處理鏈中的攔截器模式,用於在不修改處理程序的情況下新增身份驗證或請求日誌記錄等功能。 Session管理透過儲存使用者資料來保持會話狀態,可以使用gorilla/sessions管理session。

什麼是JPA?它與JDBC有什麼不同? JPA(JavaPersistenceapi)是一個用於物件關係映射(ORM)的標準接口,它允許Java開發者使用熟悉的Java物件來操作資料庫,而無需編寫直接針對資料庫的sql查詢。而JDBC(JavaDatabaseConnectivity)是Java用來連接資料庫的標準API,它需要開發者使用SQL語句來操作資料庫。 JPA將JDBC封裝起來,為物件-關聯映射提供了更方便、更高層級的API,簡化了資料存取操作。在JPA中,什麼是實體(Entity)?實體
