ES6中的Promise對象到底如何使用?

2020-12-23 德雲IT學院

文/大白老師

圖/大白老師

小夥伴們,大家好!本期大白老師將帶大家走近Promise對象。

Promise是ES6語法中新增的一個對象,主要為JavaScript異步編程提供一種解決方案。也許有人會問,為什麼要專門為JavaScript提供一種異步編程的解決方案啊?這是由JavaScript天生缺陷造成的。JavaScript本身是一種單線程程式語言,不支持多線程,所以,很多時候,需要使用異步來平衡這種先天的不足。

01

一、Promise的內容

閒言少敘,先粗暴地上一張圖,來直觀感受一下Promise:

通過上面這張圖,我們不難看出,Promise自身是一個構造函數,身上綁定有all、reject、resolve等一些列可以直接使用的方法,原型上有then、catch等處理異步的底層方法。這樣來說,在使用Promise的時候,我們只需要通過new關鍵字來創建新對象就可以了!

02

對比演示

傳統回調演示:

上述案例中,不難看出有兩個參數,參數一是a,參數二是一個函數。判斷條件為a大於10 且參數二是一個函數時,執行func2這個函數。

Promise回調演示:

通過上面兩個案例對比,我們不難發現Promise的優點:

1、Promise對象的狀態不受外界影響。

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

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

Promise對象的狀態改變,只有兩種可能:

從pending變為fulfilled和從pending變為rejected,只要這兩種情況發生,狀態就凝固了,不會再變了,會一直保持這個結果,這時就稱為 resolved(已定型);

如果改變已經發生了,你再對Promise對象添加回調函數,也會立即得到這個結果。這與事件(Event)完全不同。事件的特點是,如果你錯過了它,再去監聽,是得不到結果的。

03

Promise參數

Promise對象實例會接收兩個參數:resolve、reject。這兩個參數本身就是函數,是由JavaScript提供的,開發人員不需要自行部署。

resolve函數的作用是將Promise對象的狀態從「未完成」變為「成功」,在異步操作成功時調用,並將異步操作的結果作為參數傳遞出去。

reject函數則是將promise對象的狀態由「未完成」變為「失敗」,在異步操作失敗時調用,並作為參數傳遞出去。

此外Promise對象除了這兩個參數外,其實例對象還有還有兩個方法供使用,即then()方法和catch()方法。then()方法是調用成功時的回調函數,catch()方法用於指定發生錯誤時的回調函數。

這裡特別需要強調一下,then()方法返回的是一個Promise實例對象,因此可以採用鏈式調用,即then()方法後面再調用另一個then()方法。

鏈式調用實例:

04

總結

通過上述案例,我們不難發現,promise在處理異步操作時,更多地只是在關注數據狀態的變化。也就是說,只關注數據是回調成功還是失敗,對於其他的,則忽略。另外Promise的鏈式調用可以避免真實開發過程中回調地域的問題,提高代碼的可讀性與可維護性。

德雲IT學院,

致力於培養IT技術緊缺型人才,

教育之路,道阻且長,

我們期待與你進行思維的碰撞。

德雲IT學院

因為專注,所以專業!

德雲致力於為網際網路行業提供人才

打通了企業招聘和人才就業的雙向渠道

對標一線網際網路大廠崗位需求

培養高端IT技能緊缺型人才

是學員和企業信賴的IT職業教育機構

相關焦點

  • ES6之Promise的使用
    通常而言,如果你不知道一個值是否是Promise對象,使用Promise.resolve(value) 來返回一個Promise對象,這樣就能將該value以Promise對象形式使用。Promise 原型屬性Promise.prototype.constructor返回被創建的實例函數. 默認為 Promise 函數.
  • 如何使用Promise.race() 和 Promise.any() ?
    返回值一個待定的 Promise 只要給定的迭代中的一個promise解決或拒絕,就採用第一個promise的值作為它的值,從而異步地解析或拒絕(一旦堆棧為空)。注意因為參數接受iterable,所以我們可以傳遞一些值,比如基本值,甚至數組中的對象。
  • 【探秘ES6】系列專欄(九):使用Babel和Broccoli
    本文接下來講述的是有關Babel和Broccoli(花椰菜)的使用。Babel的使用Babel是一個原始碼到原始碼的轉換器,例如ES6到ES5的轉換並使代碼在主流JS引擎中執行。在項目中可通過多種方式來使用Babel,例如命令行方式,其格式為:babel script.js --out-file script-compiled.js在瀏覽器中使用也是可以的,可以把Babel作為常規的JS庫進行連結使用:<script src="node_modules/babel-core
  • ES6 Promise實戰練習題
    3)})console.log(4)解析:Promise 構造函數是同步執行的,promise.then 中的函數是異步執行的。因為返回任意一個非 promise 的值都會被包裹成 promise 對象,即 return new Error('error!!!') 等價於 return Promise.resolve(new Error('error!!!'))。
  • JavaScript進階之Ajax的問題和什麼是promise
    可以將異步操作隊列化,按照期望的順序執行,返回符合預期的結果,可以在對象之間傳遞和操作promise,幫助我們處理隊列有了 Promise 對象,就可以將異步操作以同步操作的流程表達出來,避免了層層嵌套的回調函數。
  • 「一次寫過癮」手寫 Promise 全家桶 + Generator + async/await
    將 then 回調函數中得到的結果 y 傳入新的 Promise 解決過程中,遞歸調用。如果執行報錯,則將以對應的失敗原因拒絕 Promise。這種情況就是處理擁有 then() 函數的對象或函數,我們也叫它 thenable。
  • 箭頭函數=> 的使用與局限 - ES6中JavaScript新特性之函數
    因為這樣比較容易看出來,到底省略了哪些參數。如果非尾部的參數設置默認值,實際上這個參數是沒法省略的。(1)函數體內的`this`對象,就是定義時所在的對象,而不是使用時所在的對象。(2)不可以當作構造函數,也就是說,不可以使用`new`命令,否則會拋出一個錯誤。(3)不可以使用`arguments`對象,該對象在函數體內不存在。如果要用,可以用 rest 參數代替。
  • 「我保證」除了I promise 還能怎麼說?
    今天我們來聊聊如何表達:遵守諾言舉個場景:我太太的某寶購物車裡收藏了很多她喜歡的衣服首飾。隔三差五她就會問我什麼時候可以幫她清空購物車,我每次都會告訴她白色的謊言:I『ll empty your shopping cart tonight.
  • 溏心風暴3電視劇插曲I Promise誰唱的 I Promise歌詞歌曲介紹
    Scratched and torn  Still I'm yours to hold  We are greater than our sum of parts  Together we're a work of art  Paint and canvas lay forever  Woven at the heart  I promise
  • react中關於hook介紹及其使用
    前言最近由於公司的項目開發,就學習了在react關於hook的使用,對其有個基本的認識以及如何在項目中去應用hook。能夠解決你在不使用class組件的情況下去體現react的特性需要注意的一點就是hook和class組件是不能夠同時使用的,在實際的使用過程中一定要注意,否則就會出現報錯那麼接下來所要介紹的部分就是如何去使用hookstate hook
  • promise.race的用法——Vickey前端學習筆記
    於是寫了一段代碼運行一下,就發現,即便第一個promise已成功返回,但是第二個promise的console.error 依然執行了。莫非,Promise.race 理解的有問題?好似說的不是人話,沒看懂。
  • 周推歌曲《I promise》——獻給所有一直保持本真的人兒
    >我告訴你一個事實 這裡沒有秘密可言That's a promise and I promise I intend to keep it這是我的承諾 我保證我會信守諾言I never let the fame hit to my brains I promise I promise我永遠不會讓名利衝昏頭腦 我保證 我保證And when
  • 黃子韜2017新歌《Promise》歌詞
    time cause no one's watchin'  Never let you go,  Never let you down oh babe lay you down and fly high  用心來守護的秘密  就算我很委屈為你我也願意  我答應過你  不會再讓你受到傷害  I, I promise
  • 「我保證」只會「I promise」?老外原來這麼說!
    生活中我們常常會說「我保證...」同學們是不是想到了 I promise 呢?   咳咳,其實I promise是在相對認真、正式的場合用的,在某些場合會稍顯生硬。今天nikiki就分享給大家一個「我保證」地道口語,相比 I promise,美國人這句口頭禪更加口語化哦!
  • javascript中import和export的區別及用法總結
    ES6 模塊不是對象,而是通過export命令顯式指定輸出的代碼,再通過import命令輸入。import 的幾種用法:import用法解釋import後面的from指定模塊文件的位置,可以是相對路徑,也可以是絕對路徑,.js後綴可以省略。如果只是模塊名,不帶有路徑,那麼必須有配置文件,告訴 JavaScript 引擎該模塊的位置。
  • 2013高三英語第一輪複習:promise to do sth
    2013高三英語第一輪複習:promise to do sth 2012-09-29 00:15 來源:新東方網整理 作者:
  • 「promise the moon」不是指「對著月亮發誓」
    大家好,今天我們分享一個非常有用且地道的表達——promise the moon, 這個短語的含義不是指「對著月亮發誓」,其正確的含義是:promise the moon (to someone) 向(某人)作無法兌現的承諾; 作出過度承諾
  • 一切皆可對象:使用JavaScript創建對象的三種方法
    圖源:unsplashJavascript中的一切幾乎都是對象,無論是數組還是函數。本文將教你使用JavaScript創建對象的三種方法。對象字面量JavaScript對象字面量是指用大括號括起來的用逗號分隔的名稱——值對列表。對象字面量用於封裝代碼並將其包裝在有序的包中。
  • 【圖文搬運】在Blender中如何使用PBR紋理?
    在Blender中如何使用PBR紋理?許多小夥伴疑惑在Blender中PBR紋理到底如何正確使用。