实战IT培训机构_IT培训班选大学生IT技术培训中心_中公优就业

400-650-7353
您所在的位置:首頁(yè) > IT干貨資料 > web前端 > 【W(wǎng)eb前端基礎(chǔ)知識(shí)】如何利用promise解決異步

【W(wǎng)eb前端基礎(chǔ)知識(shí)】如何利用promise解決異步

  • 發(fā)布: Web前端培訓(xùn)
  • 來(lái)源:優(yōu)就業(yè)
  • 2021-09-28 14:16:38
  • 閱讀()
  • 分享
  • 手機(jī)端入口

我們知道,在promise對(duì)象的then方法可以處理onfulfilled和onrejected兩個(gè)事件監(jiān)聽回調(diào),但是我們一般采用catch來(lái)處理onrejected的監(jiān)聽回調(diào),因?yàn)閏atch可以捕獲部分程序異常;有利于程序的健壯性。例如:

  1. function getBanner() { 
  2.            let p = new Promise((resolve, reject) => { 
  3.                $.ajax({ 
  4.                    type: "GET"
  5.                    url: "http://localhost:3000/api/index/banner"
  6.                    success: function (response) { 
  7.                        resolve(response); 
  8.                    }, 
  9.                    error: function (err) { 
  10.                        reject(err); 
  11.                    } 
  12.                }); 
  13.            }); 
  14.            return p; 
  15.        } 
  16.  
  17.        let p = getBanner() 
  18.            .then(rst => { 
  19.                return rst; 
  20.            }) 
  21.            .catch(err => { 
  22.                console.log(err); 
  23.            }); 

我們通過jQuery的ajax來(lái)向服務(wù)器發(fā)起輪播圖數(shù)據(jù)的請(qǐng)求,上面代碼若是正確的執(zhí)行則會(huì)進(jìn)入then方法里處理,若是異常的,也就是說(shuō)必然進(jìn)入catch環(huán)節(jié),這代碼看起來(lái)并沒有什么,好像也并不復(fù)雜。

但是,如果在異步請(qǐng)求過程中出現(xiàn)了幾個(gè)請(qǐng)求直接有依賴關(guān)系,則使用這種解決方案就復(fù)雜得多了。例如:

  1. $.ajax({ 
  2.            url: "http://www.ujiuye.tech/:3000/api/firstCategory", // 所有一級(jí)分類 
  3.            dataType: "json"
  4.            success(res) { 
  5.                $.ajax({ 
  6.                    url: `http://www.ujiuye.tech/:3000/api/secondCategory`, // 傳遞一級(jí)ID換取下屬的二級(jí)分類列表 
  7.                    data: { 
  8.                        firstId: res['list'][0][0]['firstId'
  9.                    }, 
  10.                    dataType: "json"
  11.                    success(res2) { 
  12.                        $.ajax({ 
  13.                            url: `http://www.ujiuye.tech/:3000/api/thiredCategory`, // 傳遞二級(jí)分類ID, 獲取下屬的三級(jí)分類列表 
  14.                            data: { 
  15.                                secondId: res2['list'][0]['secondId'
  16.                            }, 
  17.                            dataType: "json"
  18.                            success(res3) { 
  19.                                $.ajax({ 
  20.                                    url: `http://www.ujiuye.tech/:3000/api/categoryList`,// 傳遞三級(jí)分類ID, 獲取下屬的商品數(shù)據(jù)列表 
  21.                                    data: { 
  22.                                        thiredId: res3['list'][0]['thiredId'
  23.                                    }, 
  24.                                    dataType: "json"
  25.                                    success(result) { 
  26.                                        console.log(result); 
  27.                                    } 
  28.                                }) 
  29.                            } 
  30.                        }) 
  31.                    } 
  32.                }) 
  33.            } 
  34.        }) 

在小U商城項(xiàng)目中的商品列表頁(yè)面,我們同時(shí)要發(fā)起四個(gè)請(qǐng)求來(lái)分別獲取:一級(jí)分類、二級(jí)分類、三級(jí)分類和商品,那么這是時(shí)候利用回調(diào)函數(shù)會(huì)出現(xiàn)”回調(diào)地獄”的現(xiàn)象,即使是使用promise來(lái)優(yōu)化,也會(huì)出現(xiàn)大量的代碼嵌套,這樣的代碼會(huì)容易讓人疑惑,而且也不利于后續(xù)的開發(fā)維護(hù)。所以我們可以使用async...await來(lái)優(yōu)化這些。

例如上面請(qǐng)求輪播圖的例子,使用async和await來(lái)優(yōu)化之后:

  1. function getBanner() { 
  2.             let p = new Promise((resolve, reject) => { 
  3.                 $.ajax({ 
  4.                     type: "GET"
  5.                     url: "http://localhost:3000/api/index/banner"
  6.                     success: function (response) { 
  7.                         resolve(response); 
  8.                     }, 
  9.                     error: function (err) { 
  10.                         reject(err); 
  11.                     } 
  12.                 }); 
  13.             }); 
  14.             return p; 
  15.         } 
  16.  
  17.         async function getData(){ 
  18.             let data=await getBanner(); 
  19.             console.log(data); 
  20.         } 

這樣的代碼相比于上面的代碼要簡(jiǎn)化很多,但是也有弊端,由于await只能接收promise的成功結(jié)果,也就是說(shuō),若上面代碼出現(xiàn)了異常,則代碼會(huì)中斷執(zhí)行。作為一個(gè)優(yōu)秀的開發(fā)人員肯定不希望代碼崩掉,那么該如何解決異常呢,有兩種方案:一是采用try..catch來(lái)捕獲異常,另外是使用catch

  1. async function getData() { 
  2.             try { 
  3.                 let data = await getBanner(); 
  4.                 console.log(data); 
  5.             } catch (e) { 
  6.                 console.log(e); 
  7.             } 
  8.         } 
  9.  
  10.         //或者 
  11.         async function getData() { 
  12.             let data = await getBanner().catch(e => { 
  13.                 console.log(e); 
  14.             }) 
  15.             console.log(data); 
  16.         } 

但這兩種方案都又會(huì)出現(xiàn)嵌套,特別是若發(fā)起一些負(fù)責(zé)的請(qǐng)求(例如上面回調(diào)地獄的情況),則代碼依然非常復(fù)雜,那么有沒有更好的解決方案呢。答案是有。在項(xiàng)目開發(fā)過程中,我們經(jīng)常使用await-to-js的技術(shù)來(lái)解決這個(gè)問題:

  1. function to(p) { 
  2.            return p 
  3.                .then(data => [null, data]) 
  4.                .catch(err => [err, null]); 
  5.        } 

其實(shí)這個(gè)方案依然是利用promise的鏈?zhǔn)秸{(diào)用原理來(lái)解決的。那么使用,最后代碼為:

  1. function to(p) { 
  2.            return p 
  3.                .then(data => [null, data]) 
  4.                .catch(err => [err, null]); 
  5.        } 
  6.  
  7.        async function getData() { 
  8.            let [err, data] = await to(getBanner()) 
  9.        } 

利用這個(gè)方案,大家發(fā)現(xiàn),代碼量不僅大大的減少,而且兼容性更加友好。

文章“【W(wǎng)eb前端基礎(chǔ)知識(shí)】如何利用promise解決異步”已幫助

>>本文地址:http://www.jecan.cn/zhuanye/2021/70198.html

THE END  

聲明:本站稿件版權(quán)均屬中公教育優(yōu)就業(yè)所有,未經(jīng)許可不得擅自轉(zhuǎn)載。

1 您的年齡

2 您的學(xué)歷

3 您更想做哪個(gè)方向的工作?

獲取測(cè)試結(jié)果
  • 大前端大前端
  • 大數(shù)據(jù)大數(shù)據(jù)
  • 互聯(lián)網(wǎng)營(yíng)銷互聯(lián)網(wǎng)營(yíng)銷
  • JavaJava
  • Linux云計(jì)算Linux
  • Python+人工智能Python
  • 嵌入式物聯(lián)網(wǎng)嵌入式
  • 全域電商運(yùn)營(yíng)全域電商運(yùn)營(yíng)
  • 軟件測(cè)試軟件測(cè)試
  • 室內(nèi)設(shè)計(jì)室內(nèi)設(shè)計(jì)
  • 平面設(shè)計(jì)平面設(shè)計(jì)
  • 電商設(shè)計(jì)電商設(shè)計(jì)
  • 網(wǎng)頁(yè)設(shè)計(jì)網(wǎng)頁(yè)設(shè)計(jì)
  • 全鏈路UI/UE設(shè)計(jì)UI設(shè)計(jì)
  • VR/AR游戲開發(fā)VR/AR
  • 網(wǎng)絡(luò)安全網(wǎng)絡(luò)安全
  • 新媒體與短視頻運(yùn)營(yíng)新媒體
  • 直播帶貨直播帶貨
  • 智能機(jī)器人軟件開發(fā)智能機(jī)器人
 

快速通道fast track

近期開班時(shí)間TIME

主站蜘蛛池模板: 防火窗_耐火窗_防火门厂家_防火卷帘门-重庆三乐门业有限公司 | 软瓷_柔性面砖_软瓷砖_柔性石材_MCM软瓷厂家_湖北博悦佳软瓷 | 压缩空气冷冻式干燥机_吸附式干燥机_吸干机_沪盛冷干机 | 磁力轮,磁力联轴器,磁齿轮,钕铁硼磁铁-北京磁运达厂家 | 桁架机器人_桁架机械手_上下料机械手_数控车床机械手-苏州清智科技装备制造有限公司 | 河南不锈钢水箱_地埋水箱_镀锌板水箱_消防水箱厂家-河南联固供水设备有限公司 | 打孔器,打孔钳厂家【温州新星德牌五金工具】 | 冷藏车厂家|冷藏车价格|小型冷藏车|散装饲料车厂家|程力专用汽车股份有限公司销售十二分公司 | 不锈钢钢格栅板_热浸锌钢格板_镀锌钢格栅板_钢格栅盖板-格美瑞 | 篮球地板厂家_舞台木地板品牌_体育运动地板厂家_凯洁地板 | 压片机_高速_单冲_双层_花篮式_多功能旋转压片机-上海天九压片机厂家 | 没斑啦-专业的祛斑美白嫩肤知识网站-去斑经验分享 | ETFE膜结构_PTFE膜结构_空间钢结构_膜结构_张拉膜_浙江萬豪空间结构集团有限公司 | 聚丙烯酰胺_厂家_价格-河南唐达净水材料有限公司 | 脉冲除尘器,除尘器厂家-淄博机械 | 工控机-图像采集卡-PoE网卡-人工智能-工业主板-深圳朗锐智科 | 环氧乙烷灭菌器_压力蒸汽灭菌器_低温等离子过氧化氢灭菌器 _低温蒸汽甲醛灭菌器_清洗工作站_医用干燥柜_灭菌耗材-环氧乙烷灭菌器_脉动真空压力蒸汽灭菌器_低温等离子灭菌设备_河南省三强医疗器械有限责任公司 | 隧道烘箱_隧道烘箱生产厂家-上海冠顶专业生产烘道设备 | 无线联网门锁|校园联网门锁|学校智能门锁|公租房智能门锁|保障房管理系统-KEENZY中科易安 | 自清洗过滤器,浅层砂过滤器,叠片过滤器厂家-新乡市宇清净化 | 三防漆–水性三防漆–水性浸渍漆–贝塔三防漆厂家 | 不锈钢监控杆_监控立杆厂家-廊坊耀星光电科技有限公司 | 电解抛光加工_不锈钢电解抛光_常州安谱金属制品有限公司 | 咖啡加盟,咖啡店加盟连锁品牌-卡小逗| 水平筛厂家-三轴椭圆水平振动筛-泥沙震动筛设备_山东奥凯诺矿机 包装设计公司,产品包装设计|包装制作,包装盒定制厂家-汇包装【官方网站】 | 学习安徽网| 碳纤维复合材料制品生产定制工厂订制厂家-凯夫拉凯芙拉碳纤维手机壳套-碳纤维雪茄盒外壳套-深圳市润大世纪新材料科技有限公司 | 气动球阀_衬氟蝶阀_调节阀_电动截止阀_上海沃托阀门有限公司 | 滑石粉,滑石粉厂家,超细滑石粉-莱州圣凯滑石有限公司 | 化妆品加工厂-化妆品加工-化妆品代加工-面膜加工-广东欧泉生化科技有限公司 | 水压力传感器_数字压力传感器|佛山一众传感仪器有限公司|首页 | 北京翻译公司-专业合同翻译-医学标书翻译收费标准-慕迪灵 | 浙江富广阀门有限公司| 河南正规膏药生产厂家-膏药贴牌-膏药代加工-修康药业集团官网 | 滁州高低温冲击试验箱厂家_安徽高低温试验箱价格|安徽希尔伯特 | 高铝轻质保温砖_刚玉莫来石砖厂家_轻质耐火砖价格 | 牛皮纸|牛卡纸|进口牛皮纸|食品级牛皮纸|牛皮纸厂家-伽立实业 | 聚合氯化铝-碱式氯化铝-聚合硫酸铁-聚氯化铝铁生产厂家多少钱一吨-聚丙烯酰胺价格_河南浩博净水材料有限公司 | 便携式谷丙转氨酶检测仪|华图生物科技百科 | 常州减速机_减速机厂家_常州市减速机厂有限公司 | 管家婆-管家婆软件-管家婆辉煌-管家婆进销存-管家婆工贸ERP |