淺析JavaScript中回調地獄與asyn函數(shù)和await函數(shù)原理
一、回調地獄
1、回調函數(shù):把一個函數(shù)作為參數(shù)傳遞給另一個函數(shù),在另一個函數(shù)中作為參數(shù)的函數(shù)不會立即執(zhí)行,只有當滿足某個條件后才會執(zhí)行,這個函數(shù)稱為回調函數(shù)。
2、同步任務:主線程中的程序依次排列,只有當前一個任務執(zhí)行結束后才會執(zhí)行后一個任務。
3、異步任務:不會進入主線程隊列,它會進入異步的隊列。前一個任務是否執(zhí)行完畢不影響下一個任務的執(zhí)行。
異步任務又稱為不阻塞任務。
3、回調地獄:回調函數(shù)嵌套回調函數(shù)就會形成回調地獄
4、回調地獄的缺點
(1)可讀性差、維護困難
(2)無法進行return和throw
(3)多個回調之間無法建立練習
二、Promise對象
promise:是一個原生的js對象,為了解決回調地獄問題,可以替換掉回調函數(shù)。是一個新的異步任務的解決方案。
1、promise的三種狀態(tài)
(1)pending[待定] 初始狀態(tài)
(2)resloved[實現(xiàn)] 操作成功
(3)reject[被否決] 操作失敗
2、執(zhí)行過程
(1)當promise對象的狀態(tài)發(fā)生改變時就會觸發(fā)后面的.then()里的響應函數(shù)處理后續(xù)步驟
(2)狀態(tài)一經(jīng)改變,不會再變
(3)promise實例對象一經(jīng)創(chuàng)建,就會立即執(zhí)行
注:promise對象之所以可以連續(xù)的.then是因為.then里面的回調函數(shù)的返回值也是一個promise對象。
3、構造函數(shù)
Promise(reslove,reject)
reslove:表示異步操作成功后的函數(shù),將promise對象的狀態(tài)由初始化狀態(tài)轉換到成功,并將函數(shù)的執(zhí)行結果傳遞出去,由下一個then接收
reject:表示異步操作失敗后的回調函數(shù),在回調函數(shù)執(zhí)行錯誤時,并將錯誤的信息作為參數(shù)傳遞出去,由catch來接收。
4、Promise的all方法:實現(xiàn)了異步任務并行執(zhí)行能力
function getWidth() { return new Promise((resolve,reject)=>{ setTimeout(resolve(5),1000) }) } function getHight(){ return new Promise((resolve,reject)=>{ setTimeout(resolve(4),1000) }) } Promise.all([getWidth(),getHight()]).then((result)=>{ console.log('result:',result); })
三、syn函數(shù)和await函數(shù)
1、Promise對象的缺陷:雖然跳出了回調地獄,但是在流程復雜的代碼中會出現(xiàn)很多的then,這樣會導致代碼的可讀性差。
2、async/await出現(xiàn)的原因:是對Promise的一種優(yōu)化,又稱為Promise的語法糖。
var sleep = function(time){ return new Promise((resolve,reject)=>{ setTimeout(function () { resolve(); },time) }) } var start = async function(){ //異步調用,實現(xiàn)同步效果 console.log('start') await sleep(3000).then((data)=>{ console.log('end') }) } start();
2、asyns/await的使用規(guī)則
(1)await關鍵字只能在asyc標識的函數(shù)中使用
(2)await后面可以直接跟一個Promise對象(更多的是跟一個返回Promise對象的表達式)
(3)await函數(shù)不能單獨使用
(4)await可以直接拿到promise中resolve中的數(shù)據(jù)
4、promise和async/await區(qū)別
(1)promise是ES6中出現(xiàn),async/await是在ES7中出現(xiàn)的
(2)async/await的寫法更優(yōu)雅
(3)對reject狀態(tài)的捕捉方式不同
- promise采用.then后面跟.catch方法捕捉,通常.catch放在最后
- async/await可以用.then后面跟.catch方法捕捉,也可以用try...catch方法捕捉
到此這篇關于淺析JavaScript中回調地獄與asyn函數(shù)和await函數(shù)原理的文章就介紹到這了,更多相關JS回調地獄與asyn函數(shù)和await函數(shù)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
漂亮的widgets,支持換膚和后期開發(fā)新皮膚(2007-4-27已更新1.7alpha)
漂亮的widgets,支持換膚和后期開發(fā)新皮膚(2007-4-27已更新1.7alpha)...2007-04-04webpack-url-loader 解決項目中圖片打包路徑問題
這篇文章主要介紹了webpack-url-loader 解決項目中圖片打包路徑問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-02-02nest.js 使用express需要提供多個靜態(tài)目錄的操作方法
這篇文章主要介紹了nest.js 使用express需要提供多個靜態(tài)目錄的操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-10-10JS PHP字符串截取函數(shù)實現(xiàn)原理解析
這篇文章主要介紹了JS PHP字符串截取函數(shù)實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-08-08Javascript+XMLHttpRequest+asp.net無刷新讀取數(shù)據(jù)庫數(shù)據(jù)
Javascript+XMLHttpRequest+asp.net無刷新讀取數(shù)據(jù)庫數(shù)據(jù)2009-08-08