首页
/
每日頭條
/
生活
/
es6前端教程
es6前端教程
更新时间:2024-10-13 04:25:06
往期回顧:

前端開發必備 - ES6 新特性之 let 和 const 命令

前端開發必備 - ES6 新特性之 變量的解構賦值

前端開發必備 - ES6 新特性之 字符串的拓展

前端開發必備 - ES6 新特性之 正則的拓展

前端開發必備 - ES6 新特性之 數值的拓展

前端開發必備 - ES6 新特性之 對象的拓展

前端開發必備 - ES6 新特性之 Symbol

前端開發必備 - ES6 新特性之 Set和Map數據結構

前端開發必備 - ES6 新特性之 Proxy

12.1 概念

主要用途:解決異步編程帶來的回調地獄問題。

把Promise簡單理解一個容器,存放着某個未來才會結束的事件(通常是一個異步操作)的結果。通過Promise對象來獲取異步操作消息,處理各種異步操作。

Promise對象2特點:

  • 對象的狀态不受外界影響。

Promise對象代表一個異步操作,有三種狀态:pending(進行中)、fulfilled(已成功)和rejected(已失敗)。隻有異步操作的結果,可以決定當前是哪一種狀态,任何其他操作都無法改變這個狀态。這也是Promise這個名字的由來,它的英語意思就是“承諾”,表示其他手段無法改變。

  • 一旦狀态改變,就不會再變,任何時候都可以得到這個結果。

Promise對象的狀态改變,隻有兩種可能:從pending變為fulfilled和從pending變為rejected。隻要這兩種情況發生,狀态就凝固了,不會再變了,會一直保持這個結果,這時就稱為 resolved(已定型)。如果改變已經發生了,你再對Promise對象添加回調函數,也會立即得到這個結果。這與事件(Event)完全不同,事件的特點是,如果你錯過了它,再去監聽,是得不到結果的。

注意,為了行文方便,本章後面的resolved統一隻指fulfilled狀态,不包含rejected狀态。

Promise缺點

  • 無法取消Promise,一旦新建它就會立即執行,無法中途取消。
  • 如果不設置回調函數,Promise内部抛出的錯誤,不會反應到外部。
  • 當處于pending狀态時,無法得知目前進展到哪一個階段(剛剛開始還是即将完成)。
12.2 基本使用

Promise為一個構造函數,需要用new來實例化。

es6前端教程(前端開發必備-)1

Promise接收一個函數作為參數,該函數兩個參數resolve和reject,有JS引擎提供。

  • resolve作用是将Promise的狀态從pending變成resolved,在異步操作成功時調用,返回異步操作的結果,作為參數傳遞出去。
  • reject作用是将Promise的狀态從pending變成rejected,在異步操作失敗時報錯,作為參數傳遞出去。

Promise實例生成以後,可以用then方法分别指定resolved狀态和rejected狀态的回調函數。

es6前端教程(前端開發必備-)2

幾個例子來理解 :

  • 當一段時間過後,Promise狀态便成為resolved觸發then方法綁定的回調函數。

es6前端教程(前端開發必備-)3

  • Promise新建後立刻執行。

es6前端教程(前端開發必備-)4

異步加載圖片:

es6前端教程(前端開發必備-)5

resolve函數和reject函數的參數為resolve函數或reject函數:

p1的狀态決定了p2的狀态,所以p2要等待p1的結果再執行回調函數。

es6前端教程(前端開發必備-)6

調用resolve或reject不會結束Promise參數函數的執行,除了return:

es6前端教程(前端開發必備-)7

12.3 Promise.prototype.then()

作用是為Promise添加狀态改變時的回調函數,then方法的第一個參數是resolved狀态的回調函數,第二個參數(可選)是rejected狀态的回調函數。

then方法返回一個新Promise實例,與原來Promise實例不同,因此可以使用鍊式寫法,上一個then的結果作為下一個then的參數。

es6前端教程(前端開發必備-)8

12.4 Promise.prototype.catch()

Promise.prototype.catch方法是.then(null, rejection)的别名,用于指定發生錯誤時的回調函數。

es6前端教程(前端開發必備-)9

如果 Promise 狀态已經變成resolved,再抛出錯誤是無效的。

es6前端教程(前端開發必備-)10

當promise抛出一個錯誤,就被catch方法指定的回調函數捕獲,下面三種寫法相同。

es6前端教程(前端開發必備-)11

一般來說,不要在then方法裡面定義Reject 狀态的回調函數(即then的第二個參數),總是使用catch方法。

es6前端教程(前端開發必備-)12

12.5 Promise.prototype.finally()

finally方法用于指定不管 Promise 對象最後狀态如何,都會執行的操作。該方法是 ES2018 引入标準的。

es6前端教程(前端開發必備-)13

finally不接收任何參數,與狀态無關,本質上是then方法的特例。

es6前端教程(前端開發必備-)14

上面代碼中,如果不使用finally方法,同樣的語句需要為成功和失敗兩種情況各寫一次。有了finally方法,則隻需要寫一次。

finally方法總是會返回原來的值。

es6前端教程(前端開發必備-)15

12.6 Promise.all()

用于将多個 Promise 實例,包裝成一個新的 Promise 實例,參數可以不是數組,但必須是Iterator接口,且返回的每個成員都是Promise實例。

const p = Promise.all([p1, p2, p3]);

p的狀态由p1、p2、p3決定,分成兩種情況。

  1. 隻有p1、p2、p3的狀态都變成fulfilled,p的狀态才會變成fulfilled,此時p1、p2、p3的返回值組成一個數組,傳遞給p的回調函數。
  2. 隻要p1、p2、p3之中有一個被rejected,p的狀态就變成rejected,此時第一個被reject的實例的返回值,會傳遞給p的回調函數。

es6前端教程(前端開發必備-)16

上面代碼中,promises是包含 6 個 Promise 實例的數組,隻有這 6 個實例的狀态都變成fulfilled,或者其中有一個變為rejected,才會調用Promise.all方法後面的回調函數。

注意:如果Promise的參數中定義了catch方法,則rejected後不會觸發Promise.all()的catch方法,因為參數中的catch方法執行完後也會變成resolved,當Promise.all()方法參數的實例都是resolved時就會調用Promise.all()的then方法。

es6前端教程(前端開發必備-)17

如果參數裡面都沒有catch方法,就會調用Promise.all()的catch方法。

es6前端教程(前端開發必備-)18

12.7 Promise.race()

與Promise.all方法類似,也是将多個Promise實例包裝成一個新的Promise實例。

const p = Promise.race([p1, p2, p3]);

與Promise.all方法區别在于,Promise.race方法是p1, p2, p3中隻要一個參數先改變狀态,就會把這個參數的返回值傳給p的回調函數。

12.8 Promise.resolve()

将現有對象轉換成 Promise 對象。

const p = Promise.resolve($.ajax('/whatever.json'));

12.9 Promise.reject()

返回一個rejected狀态的Promise實例。

es6前端教程(前端開發必備-)19

注意,Promise.reject()方法的參數,會原封不動地作為reject的理由,變成後續方法的參數。這一點與Promise.resolve方法不一緻。

es6前端教程(前端開發必備-)20

公衆号:前端自習課

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
有機蔬菜标準
有機蔬菜标準
現在随着生活的質量越來越好,很多人對于生活的追求是越來越高的。現在很多人都希望可以吃到有機蔬菜,以為内有機蔬菜的營養更高,而且更加有營養價值,更加健康。說了有機蔬菜那麼多的好處,那麼有機蔬菜的一個标準是什麼呢,估計這個是沒有多少人知道的,隻是知道有機蔬菜好。有機蔬菜好在哪裡這個大家要知道,有機蔬菜的...
2024-10-13
大型床罩與被套洗滌方法
大型床罩與被套洗滌方法
大型床罩與被套洗滌方法:如果并不肯定床罩與被套可用洗衣機洗,最好的方法是幹洗,以免縮水。但必須先行過水及脫水,這樣便能清除大部分塵垢。清洗後,保持微濕,待晾幹後,便可恢複原狀。
2024-10-13
馬桶清理養護需留意 莫讓其成為疾病之源
馬桶清理養護需留意 莫讓其成為疾病之源
馬桶可以說是人類最親密的家居夥伴之一,人們幾乎每天都要使用,但正因為如此親密的關系,使用稍不留意,它也可能成為疾病之源。清理養護需留意,莫讓馬桶成為疾病之源馬桶圈細菌多要重點清潔調查發現,32%的馬桶上有痢疾杆菌,其中一種名為'宋内'的痢疾杆菌在馬桶圈上存活的時間長達17天;另一份實...
2024-10-13
巧開鏽鎖
巧開鏽鎖
巧開鏽鎖的材料:普通白紙、鉛筆、一把小刀。巧開鏽鎖步驟:1、把白紙墊在桌子上,把鉛筆芯削成粉末。2、把削下來的鉛筆芯,倒在鎖眼裡,同時也可以把鉛筆芯塗在鑰匙上,然後就可以鑰匙插進去,就像這樣,先反複多插幾次,讓鑰匙和鎖之間充分潤滑,同時破壞掉鐵鏽,最後就可以慢慢的試試左右擰開了。
2024-10-13
科目二s彎技巧看點位置有哪些?
科目二s彎技巧看點位置有哪些?
保持全程一擋行駛,打方向不可過急;進入彎道後盡量走大圈,駛向右彎道時,右輪緊貼着右邊路邊緣線;處于彎道時,通過轉向盤讓汽車内側車蓋頭上的小後視鏡始終處于外側白線邊緣;根據路彎的特點和後輪半徑及時調整方向。曲線行駛的訓練目的是培養機動車駕駛人轉向的運用及對車輪軌迹運行的掌握技能。了解曲線行駛的路線圖是...
2024-10-13
Copyright 2023-2024 - www.tftnews.com All Rights Reserved