Promise詳解

什么是Promise呢?
ES6中一個(gè)非常重要和好用的特性就是Promise
Promise是異步編程的一種解決方案。

那什么時(shí)候我們會(huì)來處理異步事件呢?
一種很常見的場(chǎng)景應(yīng)該就是網(wǎng)絡(luò)請(qǐng)求了。
我們封裝一個(gè)網(wǎng)絡(luò)請(qǐng)求的函數(shù),因?yàn)椴荒芰⒓茨玫浇Y(jié)果,所以不能像簡(jiǎn)單的3+4=7一樣將結(jié)果返回。
所以往往我們會(huì)傳入另外一個(gè)函數(shù),在數(shù)據(jù)請(qǐng)求成功時(shí),將數(shù)據(jù)通過傳入的函數(shù)回調(diào)出去。
如果只是一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)請(qǐng)求,那么這種方案不會(huì)給我們帶來很大的麻煩。

但是,當(dāng)網(wǎng)絡(luò)請(qǐng)求非常復(fù)雜時(shí),就會(huì)出現(xiàn)回調(diào)地獄。

網(wǎng)絡(luò)請(qǐng)求的回調(diào)地獄


回調(diào)地獄.png

我們更加期望的是一種更加優(yōu)雅的方式來進(jìn)行這種異步操作。
如何做呢?就是使用Promise。

Promise的基本使用
我們先來看看Promise最基本的語法。
這里,我們用一個(gè)定時(shí)器來模擬異步事件:
假設(shè)下面的data是從網(wǎng)絡(luò)上1秒后請(qǐng)求的數(shù)據(jù)
console.log就是我們的處理方式。
這是我們過去的處理方式,我們將它換成Promise代碼


promise1.png

首先,下面的Promise代碼明顯比上面的代碼看起來還要復(fù)雜。
其次,下面的Promise代碼中包含的resolve、reject、then、catch都是些什么

解析

我們先來認(rèn)認(rèn)真真的讀一讀這個(gè)程序到底做了什么

new Promise很明顯是創(chuàng)建一個(gè)Promise對(duì)象
小括號(hào)中((resolve, reject) => {})也很明顯就是一個(gè)函數(shù),箭頭函數(shù)。
但是resolve, reject它們是什么呢?
我們先知道一個(gè)事實(shí):在創(chuàng)建Promise時(shí),傳入的這個(gè)箭頭函數(shù)是固定的(一般我們都會(huì)這樣寫)
resolve和reject它們兩個(gè)也是函數(shù),通常情況下,我們會(huì)根據(jù)請(qǐng)求數(shù)據(jù)的成功和失敗來決定調(diào)用哪一個(gè)。
成功還是失?。?br> 如果是成功的,那么通常我們會(huì)調(diào)用resolve(messsage),這個(gè)時(shí)候,我們后續(xù)的then會(huì)被回調(diào)。
如果是失敗的,那么通常我們會(huì)調(diào)用reject(error),這個(gè)時(shí)候,我們后續(xù)的catch會(huì)被回調(diào)。
OK,這就是Promise最基本的使用了。

Promise三種狀態(tài)

首先, 當(dāng)我們開發(fā)中有異步操作時(shí), 就可以給異步操作包裝一個(gè)Promise
異步操作之后會(huì)有三種狀態(tài)

我們一起來看一下這三種狀態(tài):
pending:等待狀態(tài),比如正在進(jìn)行網(wǎng)絡(luò)請(qǐng)求,或者定時(shí)器沒有到時(shí)間。
fulfill:滿足狀態(tài),當(dāng)我們主動(dòng)回調(diào)了resolve時(shí),就處于該狀態(tài),并且會(huì)回調(diào).then()
reject:拒絕狀態(tài),當(dāng)我們主動(dòng)回調(diào)了reject時(shí),就處于該狀態(tài),并且會(huì)回調(diào).catch()


promise2.png

Promise的鏈?zhǔn)秸{(diào)用

promise3.png

我們?cè)诳碢romise的流程圖時(shí),發(fā)現(xiàn)無論是then還是catch都可以返回一個(gè)Promise對(duì)象。
所以,我們的代碼其實(shí)是可以進(jìn)行鏈?zhǔn)秸{(diào)用的:
這里我們直接通過Promise包裝了一下新的數(shù)據(jù),將Promise對(duì)象返回了
Promise.resovle():將數(shù)據(jù)包裝成Promise對(duì)象,并且在內(nèi)部回調(diào)resolve()函數(shù)
Promise.reject():將數(shù)據(jù)包裝成Promise對(duì)象,并且在內(nèi)部回調(diào)reject()函數(shù)

鏈?zhǔn)秸{(diào)用簡(jiǎn)寫

簡(jiǎn)化版代碼:
如果我們希望數(shù)據(jù)直接包裝成Promise.resolve,那么在then中可以直接返回?cái)?shù)據(jù)
注意下面的代碼中,我講return Promise.resovle(data)改成了return data
結(jié)果依然是一樣的


promise4.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在ES6當(dāng)中添加了很多新的API其中很值得一提的當(dāng)然少不了Promise,因?yàn)镻romise的出現(xiàn),很輕松的就給開...
    嘿_那個(gè)誰閱讀 3,744評(píng)論 2 3
  • promise簡(jiǎn)介 Promise的出現(xiàn),原本是為了解決回調(diào)地獄的問題。所有人在講解Promise時(shí),都會(huì)以一個(gè)a...
    指尖跳動(dòng)閱讀 3,335評(píng)論 0 1
  • 前言 本文旨在簡(jiǎn)單講解一下javascript中的Promise對(duì)象的概念,特性與簡(jiǎn)單的使用方法。并在文末會(huì)附上一...
    _暮雨清秋_閱讀 2,312評(píng)論 0 3
  • Promise詳解詞:Promise,resolve,reject,Prepending,Resolve,Reje...
    吳佳浩閱讀 1,041評(píng)論 0 2
  • Promise是什么? Promise是異步編程的一種解決方案,比傳統(tǒng)的解決方案--回調(diào)函數(shù)和事件--更加合理...
    圭寧_2ce3閱讀 610評(píng)論 0 0

友情鏈接更多精彩內(nèi)容