世界快消息!js基礎知識:Promise鏈式調用
文章目錄
(資料圖片僅供參考)
1. 簡單運用Promise2. Promise三個狀態3. Promise鏈式調用4. Promise.all5. Promise.race6. Axios——Promise封裝的Ajax7. async/await
1. 簡單運用Promise
function sleep(time) {return new Promise(function(resolve, reject) {if(time < 1000) {setTimeout(resolve("You are success"), time); } else {reject("fail"); } })}sleep(500).then(msg => {console.log(msg);}).catch(err => {console.log(err);});
控制臺查看結果:
一般在使用Promise的時候,會在定義的函數中返回一個Promise構造函數,該構造函數包含兩個參數,分別是resolve和reject。在上面的代碼中,我們調用sleep方法,傳入500。而我們使用了Promise的內置方法then,并且向then中傳兩個參數,一個是成功回調函數,一個是失敗回調函數(本例中省略第二個參數)。當承諾成功兌現,第一個回調就會被調用,而當出現錯誤的時候,就會調用第二個參數reject(此處省略)。由于500小于1000,因此會執行setTimeout(resolve(“You are success”), time),輸出了You are success。 在上面的例子中,我們還使用了Promise中的catch方法,當傳入的參數大于500,則會執行catch方法,catch方法中傳遞一個參數,也就是reject,因此在失敗的時候會執行它。如下:
2. Promise三個狀態
promise對象用于作為異步任務結果的占位符,代表著一個我們暫時還沒獲得但未來有希望獲得的值。正是因為這個原因,js的工程師們為Promise設置了三種狀態,分別是等待態(pending),接受態(fullfilled),失敗態(rejected)。當resolve函數被調用,promise的狀態就會變成接受態;反之,如果reject方法被調用,或者在promise調用過程中發生了一個未處理的異常,則會進入失敗態。一旦狀態改變一次,promise將不會再次改變狀態。
3. Promise鏈式調用
在本文開頭,我們提到了回調地獄,最為常見的就是使用Ajax時,由于多個相互關聯的請求多層嵌套,造成語法臃腫,對于后續的維護產生了不好的影響。而promise的鏈式調用,一定程度上解決了這個問題。我們再回到代碼:
sleep(500).then(msg => {console.log(msg);}).catch(err => {console.log(err);});
此處使用了then方法,當promise成功兌現,則觸發回調函數。我們還會發現,除了打印出You are success之外,還返回了一個Promise對象。
這就是說,每次then()都會返回一個新的promise,而這一個promise則可以交給下一個then方法使用。如下所示,每次then方法之后都返回了sleep(),而我們給出的sleep方法就是返回一個promise實例化對象,這樣不斷交給下一個then方法執行,就是我們的鏈式調用。
sleep(500).then(msg => {console.log(msg);return sleep(500);}).then(msg => {console.log(msg);return sleep(500);}).then(msg => {console.log(msg);return sleep(500);}).then(msg => {console.log(msg);return sleep(1500);}).catch(err => {console.log(err);});
控制臺輸出:
4. Promise.all
Promise除了鏈式調用實現多個步驟相互依賴之外,還提供了同時等待多個異步任務的方法,這里使用Promise中的all。
Promise.all([ sleep(500), sleep(600), sleep(1500)]).then(result => {console.log(result);}).catch(err => {console.log(err);})
控制臺輸出如下:
在這個方法的使用中,我們不關系任務執行的順序。使用的時候,我們傳入一個數組,元素則是promise對象。當調用all的時候,會等待所有的promise對象被兌現之后,返回一個成功值數組。 但是,當其中一個promise失敗,則會影響整個結果,如下所示:
5. Promise.race
當我們只關心第一個返回結果的promise時,Promise.race能幫你達成這個愿望。如同Promise.all一樣,我們在使用race的時候會傳入一個promise對象數組,,一旦該數組中的一個promise被兌現,則返回結果。為了印證這一點,我們改造一下sleep方法,如下:
function sleep(time) {return new Promise(function(resolve, reject) {if(time < 1000) {setTimeout(resolve(`${time}s later...`), time); } else {reject("fail"); } })}Promise.race([ sleep(500), sleep(600), sleep(700)]).then(result => {console.log(result);})
控制臺輸出如下:
6. Axios——Promise封裝的Ajax
在前端開發中,異步向后端發起請求有很多中方法,jQuery的Ajax,fetch,以及axios。axios的官網(http://www.axios-js.com/zh-cn/docs/)上是這樣介紹的。 和jQuery的Ajax功能相似,都是對XMLHttpRequest的封裝,讓我們能夠更好地進行異步請求。在Axios官網中還提到:“使用Promise管理異步,告別傳統callback方式”,這里說的就是Promise的鏈式調用。正是這種語法的使用,讓回調地獄問題得到了很好的解決。axios本質上也是對原生XHR的封裝,只不過它是Promise的實現版本。 Axios簡單使用代碼如下:
axios.get(url) .then(function (response) {console.log(response); }) .catch(function (error) {console.log(error); });
本質上Axios的實例化對象就是一個promise,因此當我們熟悉了promise之后再來使用axios會比較容易上手。 為了加深理解,這里使用Promise封裝一個XMLHttpRequest,模擬axios。代碼如下:
function getJSON (url) {return new Promise( (resolve, reject) => {var xhr = new XMLHttpRequest() xhr.open("GET", url, true) xhr.onreadystatechange = () => {if (this.readyState === 4) {if (this.status === 200) {resolve(this.responseText) } else {var resJson = {code: this.status, response: this.response } reject(resJson, this) } } } xhr.send() })}getJSON ("https://blog.csdn.net/").then(res => {console.log(res); }).catch(error => {console.error(error);});
非常遺憾,出現了跨域問題,但是沒關系,主要是通過一個實際的例子讓幫助大家更進一步理解promise。
7. async/await
不知道大家發現沒有,Promise雖然一定程度上解決了回調地獄問題,但是鏈式調用的語法仍然不夠優雅,我們如果能用完全同步的語法來解決異步問題,那該有多好。在ES6中,我們可以使用生成器和promise相結合的方式實現這個愿望。而JS偉大的工程師們為我們提出了更好的方案,async/await,這號稱是JavaScript解決異步問題的終極解決方案,其實是對Promise的再一次封裝,也可以說是語法糖。那么它到底如何,就請聽下回分解吧!
標簽:
相關推薦:
精彩放送:
- []視焦點訊!Linux系統如何架設石器私服?Linux系統架設石器私服教程
- []世界快消息!js基礎知識:Promise鏈式調用
- []世界熱消息:工銀瑞信添益快線貨幣有風險嗎
- []【焦點熱聞】ipad怎么分屏方法?profile之springboot-maven解決方案
- []世界實時:機械設計制造類是什么專業?機械設計制造類主要課程有哪些?
- []快訊:松下KX-MB778CN多功能一體機驅動程序安裝教程
- []全球速讀:廣東清遠:國內首條磁浮旅游專線首車正式上線
- []maven(三)最詳細的profile的使用
- []世界簡訊:股市交易時間和規則111
- []天天熱訊:市盈率高好還是低好
- []每日時訊!攝像頭碼率是什么意思?攝像頭碼率性能怎樣?
- []地球水體的比例是多少?水域占地球表面積約多少比率?
- []【世界報資訊】收到這類快遞,趕緊扔!多地警方預警
- []【環球報資訊】華懋瑜一第1C期首張價單推80伙
- []【世界新要聞】晉控電力:公司有儲能項目的前期工作,公司新能源方面在運風電項目11個,光伏項目28個
- []環球熱推薦:陜西順馳建工施工不規范被處罰 涉及項目為北京山水匯豪苑
- []焦點信息:香港機場2月客運量飆升24倍
- []今日報丨成飛集成:公司已預約4月28日發布一季度報告
- []中復神鷹:2022年歸母凈利同比上漲117% 碳纖維龍頭持續受益國產替代
- []視焦點訊!常青科技:發行價估值偏低 高分子新材料特種單體領先企業或受追捧
- []天津津南城投完成發行8.8億元超短期融資券 利率7.45%
- []當前速讀:新疆交建:該項目不屬于公司主營業務范圍
- []快訊:首旅集團20億元中期票據將付息 利率4.30%
- []全球時訊:撤退性出血是什么顏色
- []【天天報資訊】股票20日均線怎么看
- []今日觀點!新航季開啟,國際機票不再“又貴又難買”了吧?
- []環球最新:五星級酒店高薪搶人:入職5天可預支工資,萬豪希爾頓服務員月薪可過萬
- []環球速遞!藍籌股是啥意思
- []全球今日訊!牛市熊市什么意思
- []全球球精選!海航航空集團夏航季計劃恢復、新開66條國際及地區航線
- []天天基金的錢取不出來怎么辦
- []三盛控股:由于2021年報及2022中報仍未刊發 將延遲刊發2022年報
- []主動式負載平衡器說明書的封面_主動式負載平衡器
- []當前關注:正海磁材:公司的發展戰略及經營計劃敬請關注公司將于3月28日披露的《2022年年度報告》相關內容
- []熱點在線丨成都興城人居15億元公司債將付息 利率4.27%
- []瑞豐銀行50億元可轉債收問詢函 要求說明不良貸款劃分是否真實謹慎
- []當前觀點:航天動力:公司產業技術源于航天液體火箭發動機的技術應用產業,產品主要涉及民用領域,軍品業務占比較低
- []央行全面降準0.25個百分點 預計釋放5500億元中長期資金
- []環球最資訊丨寶豐能源:2022年公司出口定制LLDPE9047H、PPHP500L兩個產品,填補了國內空白
- []天天新動態:深圳龍崗:平湖跨境電商產業園正式開工 計劃2025年建成交付
- []世界熱訊:東北證券:復盤美國的七次衰退 帶給了我們哪些啟示?
- []人工智能頻現牛股 基金經理欲罷不能
- []焦點資訊:籌碼集中度高好還是低好
- []觀速訊丨今年來平均回報超44% 游戲主題ETF“霸榜”
- []年報解讀 | 城投控股2022年營收下降7.88%至84.68億元,扣非歸母凈利上市以來首虧
- []全球最資訊丨恒源煤電:根據上市公司信息披露相關準則,公司會在定期報告中披露報告期末股東人數等信息
- []環球觀天下!碳酸鋰價格腰斬逼近成本線 產業鏈期盼需求回暖
- []環球今頭條!巴比食品:截止3月10日,公司股東總人數(戶)約為1萬
- []廣東:前2月社會消費品零售總額0.79萬億元 同比增長1.8%
- []【世界時快訊】龍洲股份:您的提問請查閱我們之前的
- []世界視訊!年報解讀| 綠城服務:2022年收入同比增長18.2% 權益股東應占溢利同比下降35.3%
- []世界今日報丨年報解讀 | SOHO中國2022年由虧轉盈,違約事件得到解決,將繼續出售若干商業物業
- []博舊改?佛山多個老舊農村自建房遭哄搶,溢價率達到驚人的434%!
- []環球微頭條丨社會工作者考試成績查詢時間(社會工作者考試成績查詢)
- []天天微速訊:邯鄲市望源房地產開發85%股權掛牌轉讓 底價1.1億元
- []全球熱門:明勤掛牌轉讓泉州振貿房產50%股權 底價6.5億元
- []焦點速遞!TD早報 | Expedia等平臺成為ChatGPT插件功能第一批啟用者;萬豪迎來亞太地區第1000家酒店開業里程碑
- []當前動態:潤滑劑是否會對身體造成傷害?能否長期用!使用前須知
- []焦點短訊!學平險貓抓狗咬能報銷多少錢,根據實際的產品而定
- []新華保險的康健華尊和康健華貴B的區別
- []全球即時看!珍酒李渡集團通過港交所聆訊 2022年收入585.59億元
- []當前頭條:車輛必買的4個險,車險購買方法
- []今日視點:香格里拉2022年收入14.62億美元 歸母綜合虧損1.59億美元
- []全球速看:保險公司一年存2萬存10年,一般是沒有問題的
- []世界熱點評!保險可以提前多久續保
- []今日最新!石器世界
- []瑞安建業2022年營收63.07億港元 歸母凈虧損2.32億港元
- []沃森生物:股份回購需要結合公司發展和市場情況,嚴格履行上市公司規范運作程序進行決策
- []全球最新:麗新發展中期收入24.67億港元 歸母凈虧損擴大至13.6億港元
- []短訊!丹寨縣黨建引領“五抓五不誤”抓實農業生產
- []復星旅文2022年收入137.78億元 歸母虧損縮窄至5.45億元
- []天天熱點!115元保險怎么買
- []今日熱聞!互惠保險怎么買
- []全球觀熱點:過渡性養老金是什么意思
- []養老一年交7000能領多少,交養老金的好處
- []每日時訊!行人被車撞死了應該賠償多少錢
- []訊息:個人交養老保險價格表,有以下2種
- []財信地產控股股東轉讓1.57億股上市公司股份 套現約9.2億元
- []焦點報道:個人保險買什么最好,分以下兩種情況
- []個人養老保險繳費明細,查詢方式有以下4種
- []公積金錯繳能退回嗎
- []全球百事通!人社部取消女干部和女工人,是真是假
- []阿特斯在科創板注冊生效:計劃募資40億元,比亞迪等為股東
- []實時:2022年補繳社保的最新政策,暫未發布
- []保險返點是什么意思怎么返點
- []保險一年交多少錢,視車型而定
- []環球熱資訊!商業險和三者險有啥區別
- []【世界熱聞】社保最多可以停幾個月,沒有具體的規定
- []世界消息!外高橋35億元定增申請獲上交所受理
- []全球看點:福星股份13.4億元定增事項收到深交所審核問詢函
- []世界播報:黃岡人力資源與社會保障局(黃岡人力資源與社會保障局)
- []復星集團宣布將在青島投資建設亞特蘭蒂斯文旅項目
- []當前資訊!高送轉一般在幾月
- []環球精選!四上企業什么意思
- []美聯儲加息對a股的影響
- []視焦點訊!家鄉是我前進的動力,從非洲難民到NBA球員的加布里埃爾!
- []環球熱點評!MACD指標的優缺點
- []消息!滬股通增持股票意味著什么
- []世界熱頭條丨量比多少是最佳買入點
- []世界聚焦:神首集團是正規公司嗎
- B站注冊資本增幅400%至5億 目前由陳睿全資持股
- 光源資本出任獨家財務顧問 沐曦集成電路10億元A輪融資宣告完成
- 巨輪智能2021年上半年營收11.24億元 期內研發費用投入增長19.05%
- 紅棗期貨尾盤拉升大漲近6% 目前紅棗市場總庫存約30萬噸
- 嘉銀金科發布2021年Q2財報 期內凈利潤達1.27億元同比增長208%
- 成都銀行2021上半年凈利33.89億元 期內實現營收同比增長17.27億元
- 汽車之家發布2021年第二季度業績 期內新能源汽車品牌收入增長238%
- 中信銀行上半年實現凈利潤290.31億元 期末不良貸款余額706.82億元
- 光伏概念掀起漲停潮交易價格創新高 全天成交額達1.29億元
- 上半年生物藥大增45% 關鍵財務指標好轉營收賬款持續下降
- 世界視點!10送10股是什么意思
- 頭條焦點:鄭州公積金新政:全面開展提取住房公積金按期付房租業務
- 雙方父母初次見面忌諱
- 中泰策略:如何把握創業板反彈的驅動與主線?
- 熱門看點:股票期權是什么意思
- 每日熱聞!兩大趨勢深刻影響MICE行業;在途商旅接入飛豬 | 一周商旅動態
- 今日看點:股票壓力位什么意思
- 同程旅行發布2022年財報 ;開始回血的航司為什么還要“隨心飛”? | 一周速覽
- 股票不能賣出怎么回事
- 退市的股票股民有賠償嗎
- 當前視點!【光與夜之戀同人】(陸沉)千年之戀⑥
- 全球即時:股東減持是什么意思
- 高凈值人群什么意思
- 微資訊!美股為何大跌
- 天天快消息!新股會破發嗎
- 股票一手是多少股
- 300開頭的是什么股票
- e招貸上征信嗎
- 【獨家】股本屬于什么科目
- 世界短訊!看股票哪個軟件好
- 每日熱聞!pdf通俗講是什么意思
- 微速訊:如何學會做生意賺錢_如何學會做生意
- 觀速訊丨私募大佬最新持倉!鄧曉峰大手筆押注資源行業 加倉這兩股!馮柳加倉恒順醋業
- 熱推薦:今日外國電影從小到大惡作?。ㄓ幸徊客鈬娪爸v一對惡作劇情侶互相惡作劇想知道片名)
- 觀點:莫名我就喜歡你歌詞
- 【熱聞】必須有你的mp3
- 【世界速看料】外匯投資要樹立正確的短線操盤理念
- 焦點信息:深圳學區房市場時隔兩年又“熱”了:過戶量創近個5月新高,價格明顯回調
- 當前速遞!代替英語單詞怎么寫_代替英語
- 年報解讀④| 綠城服務:實現148.6億元營收,顯現高質量韌性發展
- 當前動態:募資60億!老牌組件龍頭加碼TOPCon電池等項目
- 光伏5.65GW!廣東發布今年重點項目清單
- 全球觀察:210組件累計出貨量超120GW,大尺寸產能全面破9成,210+N迎來強勁增長
- 拓斯達:1.如后續有明確的股權激勵實施計劃,公司將及時披露相關公告,請您關注公司相關動態
- realme 真我 11 Pro 5G / 11 Pro+ 5G 兩款手機通過TKDN認證
- 摩斯密碼怎么打漢字
- 【焦點熱聞】重大項目“跑起來” 經濟發展“熱起來”
- 天天播報:建行田國立:中國城鎮化仍有空間 房地產轉型需要長期資本支持
- 賭對了就一夜暴富?農村老舊自建房遭哄搶,溢價率驚人!原因只有兩個字…
- 焦點簡訊:罕見財報出錯!交易所出手:董事長等被通報批評
- 當前滾動:什么是現金股利
- 天天快播:創業板股票如何開通
- 股票怎么買入和賣出
- 今日精選:大額存單和理財哪個好
- 100萬的房子要交多少稅費
- 如何挑選好股票
- 萬科海外:2022年股東應占盈利約港幣2820萬元
- 【全球播資訊】廣東:1-2月房地產開發投資同比下降8.5% 商品房銷售面積下降0.2%
- 環球今日訊!牧原股份:下一步公司將不斷提高精細化管理水平,加強生產管理,進一步降低公司整體生產成本
- 首創城發:選舉劉永政為董事長
- 每日快報!時代天使2022年案例數微增:產品革新獲臨床認可,隱形矯治終端降價將替代更多固定矯治市場
- 今日關注:中國新城市:2022年實現收入5.91億元
- 環球熱推薦:股票跳空低開意味什么
- 天天熱文:股票創新低意味著什么
- 高安市屬于哪個省哪個市
- 世界今日報丨小羅:梅西是世界最佳,若他能回巴薩結束生涯就太好了
- 【環球快播報】688開頭的股票是什么板塊的
- 要聞速遞:樂事怎么了
- 深圳出臺住房公積金新規 購房者最高可多貸40%
- 當前關注:濮陽惠成:公司市場推廣穩步進行
- 【新要聞】恩格爾系數是什么意思
- 適合長期持有的股票推薦
- 天天資訊:農村戶口可以交靈活就業保險嗎
- 每日動態!xd的股票要不要賣
- 全球觀察:微軟市值是騰訊的幾倍
- 觀熱點:st退市會血本無歸嗎
- 世界看點:血壓什么時候測量比較準確
- 環球微資訊!借唄利息越來越高是怎么回事
- 【世界播資訊】生育津貼需要扣除工資嗎
- 環球熱議:剛需福音!廣州主城悄悄冒出個性價比新盤?!
- 糧食股票龍頭股有哪些
- 今日要聞!我想練歌有專門練歌軟件嗎
- 今頭條!智立方:公司持續關注相關技術發展及應用情況,目前暫未與Rokid發生業務關系
- 新資訊:業績領先或排名墊底 基金“押注式投資”加劇凈值波動
- 今日快看!2022年全國共有專任教師1880.36萬
- 焦點關注:國金證券:有望成核心主線 把握中小盤風格基金機遇
- 當前快訊:公募行業“新陳代謝”提速:又有基金發行失敗 年內66只基金清盤
- 首批72只公募基金披露2022年年度報告 知名基金經理4000字長文闡述投資策略
- CFTC商品持倉解讀:投機者增加黃金凈多頭頭寸
- 世界球精選!濱江服務:2022年實現收入19.82億元
- 全球觀點:西測測試:尊敬的投資公司的民機業務,主要是為各主機單位或者設備廠家提供適航檢測項目
- 股權爭奪戰有望落幕,中炬高新仍有虧損困局待解
- 德信服務2022年收入9.59億元 利潤同比增加13.6%
- 環球精選!德信服務:2022年總收入為人民幣9.58億元
- 全球今亮點!綠城服務:2022年實現收入148.56億元
- 全球訊息:建業新生活:2022年歸屬股東凈利潤5.62億元
- 赤芍功效作用_赤芍藥湯
- 地震、水災、化工廠爆炸……災難來臨怎么辦?江蘇災難醫學發展正穩步向前
- 天天信息:萊蒙國際預計2022年盈轉虧 錄得虧損約1.8億港元
- 當前頭條:眾安集團:2022年歸屬股東凈利潤1.86億元 同比增長約155.4%
- 【天天播資訊】明發集團預期2022年歸母利潤由18.8億降至0.3億-0.6億元
- 世界觀察:榮盛發展增發不超30億元股票申請收問詢函 稱將逐項落實并回復
- 環球關注:凱眾股份子公司擬參設合資公司 投資孵化汽車新材料相關項目
- 渝開發2022年營收8.96億元 歸母凈利潤1.63億元
- 全球短訊!中國網絡文學用戶達4.9億人,“出?!睜I收規模增長明顯
- 全球看點:大生地產:2022年溢利3.85億港元
- 天天看熱訊:歡樂家:目前公司沒有出口業務,所有產品均為內銷
- 太龍股份:3月23日公司高管黃國榮減持公司股份合計5萬股
- 當前要聞:佳兆業美好:2022年歸屬股東凈利潤9340萬元
- 天天快訊:金溢科技:3月23日公司高管羅瑞發減持公司股份合計6.43萬股