Promise 使用篇

Promise 對象是一個代理對象,它允許你為異步操作的成功和失敗分別綁定相應的處理方法(handlers)。 這讓異步方法可以像同步方法那樣返回值,但并不是立即返回最終執(zhí)行結果,而是一個能代表未來出現(xiàn)的結果的promise對象

一個 Promise有以下幾種狀態(tài):

  • pending: 初始狀態(tài),既不是成功,也不是失敗狀態(tài)。
  • fulfilled: 意味著操作成功完成。
  • rejected: 意味著操作失敗。

參數(shù)

Promise 的構造器接收一個執(zhí)行函數(shù)(executor)

executor是帶有 resolve 和 reject 兩個參數(shù)的函數(shù) 。Promise構造函數(shù)執(zhí)行時立即調用executor 函數(shù), resolve 和 reject 兩個函數(shù)作為參數(shù)傳遞給executor(executor 函數(shù)在Promise構造函數(shù)返回所建promise實例對象前被調用)。resolve 和 reject 函數(shù)被調用時,分別將promise的狀態(tài)改為fulfilled(完成)或rejected(失敗)。executor 內部通常會執(zhí)行一些異步操作,一旦異步操作執(zhí)行完畢(可能成功/失敗),要么調用resolve函數(shù)來將promise狀態(tài)改成fulfilled,要么調用reject 函數(shù)將promise的狀態(tài)改為rejected。如果在executor函數(shù)中拋出一個錯誤,那么該promise 狀態(tài)為rejected。executor函數(shù)的返回值被忽略。

屬性

Promise.length

length屬性,其值總是為 1 (構造器參數(shù)的數(shù)目)

Promise.prototype

表示 Promise 構造器的原型

基本使用

怎樣擁有 Promise 功能

只需讓該函數(shù)返回一個 Promise 就可以了

function sleep(time) {
    return new Promise(resolve => {
        console.log('executor 函數(shù)立即執(zhí)行')
        setTimeout(resolve, time)
    })
}

console.log('1000 ms 之后醒來')
sleep(1000).then(() => { console.log('嗨起來!') })

當 executor 函數(shù)出異常的時候, Promise 狀態(tài)改變成 rejected,executor函數(shù)的返回值被忽略

function sleep(time) {
    return new Promise(resolve => {
        throw 12
        // 這里將不會在執(zhí)行
        setTimeout(resolve, time)
    })
}

sleep(1000).then(null, (e) => { console.log('error', e) })

鏈式調用

Promise.resolve 返回成功狀態(tài)
Promise.reject 返回失敗狀態(tài)

// Promise.reject(1) 拋出了一個錯誤異常
// 會被最近的一個 onRejected 函數(shù)捕獲到
Promise.reject(1).then((body) => {
    console.log('success', body)
    return Promise.reject(2)
}, null).then((body) => {
    console.log('success', body)
    return 3
}, (error) => {
    console.log('error', error)
    // 當返回值不是一個 Promise 對象的時候
    // 默認包裝成 Promise 
    // 當 executor 沒有出現(xiàn)異常的時候會走到下一個 onFulfilled 函數(shù)
    return 4
}).then((body) => {
    console.log('success', body)
    // 當 executor 沒有出現(xiàn)異常的時候會走到下一個 onRejected 函數(shù)
    return a
}, (error) => {
    console.log('error', error)
}).then((body) => {
    console.log('success', body)
}, (error) => {
    console.log('error', error)
    // 當函數(shù)沒有顯示的設置返回值時
    // 默認返回一個 Promise 值為 undefined
}).then((body) => {
    console.log('success', typeof body)
}, (error) => {
    console.log('error', error)
})

Promise.all

并發(fā)操作 接收一個數(shù)組/string作為參數(shù)
當所有的結果成之后,才會走 onFulfilled ,否則走 onRejected

function sleep(time) {
    return new Promise(resolve => {
        console.log('executor 函數(shù)立即執(zhí)行')
        setTimeout(resolve, time)
    })
}

Promise.all([sleep(100), Promise.resolve(1), 2]).then(body => {
    console.log('success', body) // success [undefined, 1, 2]
})

Promise.all([sleep(100), Promise.reject(1), 2]).then(body => {
    console.log('success', body) 
    console.log(body)
}, (error) => {
    console.log('error', error) // error 1
})

// 當參數(shù)為一個空是 是同步操作
Promise.all([]).then(body => {
    console.log('success', body) // success []
    console.log(body)
})

Promise.all('').then(body => {
    console.log('success', body) // success []
    console.log(body)
})

Promise.race

接收一個數(shù)組作為參數(shù)
最后的狀態(tài)取決于數(shù)組中最快返回結果的某一項的狀態(tài)

Promise.race([sleep(100), Promise.reject(1), 2]).then(body => {
    console.log('success', body) 
    console.log(body)
}, (error) => {
    console.log('error', error) // error 1
})

Promise.race([Promise.reject(1), 2]).then(body => {
    console.log('success', body) 
    console.log(body)
}, (error) => {
    console.log('error', error) // error 1
})

Promise.race([sleep(100), sleep(0)]).then(body => {
    console.log('success', body) // success 0
    console.log(body)
}, (error) => {
    console.log('error', error) 
})

Promise.prototype.finally(onFinally) 不管成功失敗都會觸發(fā)

Promise.resolve(1).finally(() => console.log('finally'))

Promise.reject(1).finally(() => console.log('finally'))

錯誤處理

鏈式調用時 只會找到最近的一個錯誤處理函數(shù)執(zhí)行,即使監(jiān)聽了 catch 也不會觸發(fā)

Promise.reject(1)
.then()
.then(null, error => console.log('錯誤處理 then', error))  // '錯誤處理 then' 1
.catch(error => console.log('錯誤處理 catch', error))  
.finally(() => console.log('finally')) // finally

緩存當前 Promise 示例的情況下 所有的錯誤處理函數(shù)都會觸發(fā)

const p = Promise.reject(1)
p.then()
p.then(null, error => console.log('錯誤處理 then', error))  // '錯誤處理 then' 1
p.catch(error => console.log('錯誤處理 catch', error))  // '錯誤處理 catch' 1
p.finally(() => console.log('finally')) // finally

至此我們已經基本了解了 Promise 的使用了, 接下來讓我們一起探討一下 Promise 的原理

【筆記不易,如對您有幫助,請點贊,謝謝】

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容