文章目錄
- 同步和異步
- async/await
- Promise
- Promise的概念
同步和異步
? 同步:代碼按照編寫順序逐行執行,后續的代碼必須等待當前正在執行的代碼完成之后才能執行,當遇到耗時的操作(如網絡請求等)時,主線程會被阻塞,直到該操作完成。
? 異步:當遇到耗時的操作發生時,主線程不會被阻塞,主線程會繼續執行后續的代碼,而非等待耗時操作完成。
async/await
? async/await使用同步的方式編寫異步代碼,避免回調地獄。優勢在于處理多個異步操作的情況下,可以使代碼更簡潔易讀。
回調地獄是指過度使用嵌套的回調函數,導致代碼難以閱讀和維護。
async:當一個函數被標記為async后,該函數會返回一個Promise對象
await:
- 只能在async函數內部使用。
- 加上await關鍵字之后,會執行到這一行時暫停函數的剩余部分,等待網絡請求完成,然后繼續執行并獲取到請求返回的數據。
Promise
? Promise表示承諾在未來的某個時刻可能會完成并返回結果。
? 對干某些需要時間來處理結果的操作,如用戶登錄、讀取文件等,可以使用Promise對象來執行異步操作。
? Promise對象有三種狀態pending(待處理)
、fulfilled(已履行)
、rejected(被駁回)
。
- 當創建一個Promise對象時,它的初始狀態為pending,表示異步執行還未完成。
- 當異步執行成功時,會調用resolve函數把Promise對象的狀態改變為fulfilled,可通過then方法來獲取異步操作的結果。
- 當異步執行異常時,會調用reject函數把Promise對象的狀態更改為rejected,可通過catch方法來處理錯誤。
語法模版:
1. 用new關鍵字聲明了一個Promise對象
2. 這個對象有兩個參數,resolve,reject
3. 聲明了一個變量用來存儲Promise對象的應用
//定義Promise
聲明一個變量 = new Promise((resolve,reject)=>{resolve("已完成方法")reject("未完成方法")
})
//異步操作
Promise.then(result => {console.log("result:",result) //.then方法獲取resolve()方法
}).catch(error => {console.log("error:",error) //.catct方法獲取reject()方法
}).finally(()=>{console.log("異步執行結束") //異步執行之后進行調用,無論是那種結果
})
簡化形式:
聲明一個變量 = new Promise((resolve,reject)=>{resolve("已完成方法")reject("未完成方法")
}).then(result => {console.log("result:",result)
}).catch(error => {console.log("error:",error)
}).finally(()=>{console.log("異步執行結束")
})
異步操作:異步操作是指在程序執行過程中,某個操作不會立即返回結果,而是需要一段時間的等待
Promise的概念
? 因為隨著前端的業務邏輯變的越來越復雜,之前的回調函數不夠用了,多層次的嵌套會導致出現回調地獄,不好維護。所以,為了解決回調地域的問題,這個時候就使用了Promise進行優化。
? Promise也是目前前端解決異步操作多次嵌套回調的最好辦法。
Promise用法:
new Promise(()=>{//方法體1
}).then(()=>{//方法體2})
題目一:宏任務與微任務調用步驟
答案:1243
解析:宏任務就是構造函數,所以const離開執行,
Promise.then
是微任務,屬于異步操作,所以先執行console.log(4)
然后再回來執行.then
。題目二:構造函數只執行一次
答案:122
解析:構造函數只執行一次,但是
resolve
取決于調用了多次.then
(then和resolve是綁定的)。題目三:兩秒之內輸出一個“1”
答案:
解析:看到最下面有.then方法,提示使用
Promise