promise

Promsie

通俗來說,Promise就是一個(gè)承諾,例如,我承諾明年要賺1百萬,then方法中的onFulfilled就是承諾完成后要做的事,onRejected就是承諾失敗要做的事情,而Promise構(gòu)造函數(shù)中的resolve用來手動完成這個(gè)承諾,reject用來手動讓承諾失敗

overview

  1. 構(gòu)造函數(shù)

    new Promise((resolve, reject) => {})
    
  2. 實(shí)例方法(原型對象上的方法)

    Promise.prototype.then(onFulfilled, onRejected)
    Promise.prototype.catch(onRejected)
    
  3. 靜態(tài)方法

    Promise.all()
    Promsie.race()
    Promsie.resolve()
    Promsie.reject()
    
  4. 狀態(tài)

    • pedding(因?yàn)槭窃诘却隣顟B(tài)的改變,所以是ing)
    • fulfilled(因?yàn)槭莝etted,表示已經(jīng)完成的,所以需要ed)
    • rejected(因?yàn)槭莝etted,表示已經(jīng)完成的,所以需要ed)

構(gòu)造函數(shù)

new Promise((resolve, reject) => {
    resolve(val)
})
  1. 接受的參數(shù)

    接受的參數(shù)是一個(gè)function,成為executor,promise會往這個(gè)executor注入兩個(gè)函數(shù)作為參數(shù)

     - resolve
    
         當(dāng)調(diào)用resolve,表示的是把Promise的狀態(tài)從pedding變成fulfilled,那么接下去就會執(zhí)行then中注冊的onFulfilled方法
     - reject
    
         當(dāng)調(diào)用reject,表示的是把Promise的狀態(tài)從pedding變成rejected,那么接下去就會執(zhí)行then中注冊的onRejected方法
    
  2. 返回的結(jié)果

    返回的是一個(gè)promise實(shí)例,狀態(tài)是pedding

實(shí)例方法(原型對象上的方法)

  1. then

    then方法接受兩個(gè)參數(shù),onFulfilled和onRejected,返回的是一個(gè)新的Promise實(shí)例,例如:

    const p = new Promise()
    p.then(val => val) // 如果p的狀態(tài)是fulfilled,相當(dāng)于 Promise.resove(val)
    

    此時(shí)的then返回的是一個(gè)新的promise對象,如果p的狀態(tài)是fulfilled,那么then的onFulfilled函數(shù)val => val就會被執(zhí)行,然后返回一個(gè)狀態(tài)是fulfilled的promise對象,相當(dāng)于Promise.resolve(val),這也是then鏈?zhǔn)秸{(diào)用的關(guān)鍵

  2. catch

    說到catch,就要說到promise中的錯誤處理情況,promise內(nèi)部會捕獲錯誤,主要有三種情形:

     ```
     // 寫法一
     var promise = new Promise(function(resolve, reject) {
         try {
             throw new Error('test');
         } catch(e) {
             reject(e);
         }
     });
     promise.catch(function(error) {
         console.log(error);
     });
     // 寫法二
     var promise = new Promise(function(resolve, reject) {
         reject(new Error('test'));
     });
     promise.catch(function(error) {
         console.log(error);
     });
     ```
    
     1. 同步的錯誤,在promise發(fā)生的錯誤會被promise捕獲,但是不會有反應(yīng),因?yàn)殄e誤沒有被處理,但是在chrome中會拋錯
    
         ```
         new Promise((resolve, reject) => {
             throw new Error() // 不會有反應(yīng),因?yàn)閑rror被捕獲但是沒有被處理,chrome的實(shí)現(xiàn)不同
         })
         ```
     2. 異步的錯誤,異步發(fā)生的錯誤不在當(dāng)前的callstack,當(dāng)前同步的代碼已經(jīng)執(zhí)行完,沒有發(fā)現(xiàn)錯誤,所以異步的錯誤無法捕獲,會拋錯
    
         ```
         new Promise((resolve, reject) => {
             setTimeout(() => {
                 throw new Error()
             }, 0)
         })
         ```
     3. 使用reject捕獲錯誤,無論異步還是同步的都能捕獲,然后交給catch處理,注意錯誤是會冒泡,所以一般在最后使用catch捕獲錯誤
    

靜態(tài)方法

  1. Promise.resolve()

    接受的參數(shù)有三種情況:

     1. value
    
         返回一個(gè)狀態(tài)為fulfilled的promise對象,value是傳遞給onFulfilled的參數(shù)
     2. promise
    
         Promise.resolve(promise)返回的實(shí)例會"follow"promise的狀態(tài)
    
         ```
         const p1 = new Promise((resolve, reject) => {
             setTimeout(() => resolve('hello'), 1000)
         })
         const p2 = new Promise((resolve, reject) => {
             resolve(p1)
         })
         p2.then(val => console.log(val, 2))
         p1.then(val => {
             console.log(p1)
             console.log(p2)
             console.log(val, 1)
         })
         ```
         結(jié)果:過1s后,先打印出p1,是一個(gè)promise對象,狀態(tài)是resolved,然后打印p2,狀態(tài)是pedding,然后打印hello,1,然后打印hello,2
    
         有這樣的結(jié)果是因?yàn)?,傳遞給p2的resove的參數(shù)是一個(gè)promise,p1,那么p2就會"follow"p1的狀態(tài),但當(dāng)p1的狀態(tài)改變后,p2的狀態(tài)才會改變,而且會先執(zhí)行掛載在p1上回調(diào),然后再執(zhí)行掛載在p2上的回調(diào)函數(shù)
     3. thenable
    
         在MDN中對Promise.resolve中的介紹中說到,如果參數(shù)是一個(gè)thenable的對象,也就是擁有then方法的對象,那么Promise.resolve(thanable)返回的Promise實(shí)例會"follow"這個(gè)thenable對象的狀態(tài),簡單的來說,就是跟隨thenable對象狀態(tài)的改變而改變
    
         ```
         var p = Promise.resolve({
             then: (onFulfilled, onRejected) => {
                 setTimeout(onRejected, 1000, new Error())
                 set
             }
         })
         p.then(val => console.log(val)).catch(error => console.log(error))
         ```
         當(dāng)then中的onFulfilled方法被調(diào)用的時(shí)候,表示之前的promise實(shí)例的狀態(tài)是fulfilled,所以then會返回一個(gè)新的promise實(shí)例,狀態(tài)是fulfilled,相當(dāng)于Promise.resolve(val)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • Promiese 簡單說就是一個(gè)容器,里面保存著某個(gè)未來才會結(jié)束的事件(通常是一個(gè)異步操作)的結(jié)果,語法上說,Pr...
    雨飛飛雨閱讀 3,491評論 0 19
  • 00、前言Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強(qiáng)大。它由社區(qū)...
    夜幕小草閱讀 2,227評論 0 12
  • //本文內(nèi)容起初摘抄于 阮一峰 作者的譯文,用于記錄和學(xué)習(xí),建議觀者移步于原文 概念: 所謂的Promise,...
    曾經(jīng)過往閱讀 1,320評論 0 7
  • Promise的含義: ??Promise是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和...
    呼呼哥閱讀 2,275評論 0 16
  • 編后吐槽:寫的快花眼,很詳細(xì),耐心看必受益匪淺 JavaScript的執(zhí)行環(huán)境是「單線程」的。所謂單線程,是指JS...
    果汁涼茶丶閱讀 4,763評論 8 27

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