promise對象裏resolve和reject狀態講解及Promise.all()的使用

首先來講下同步異步與阻塞非阻塞的概念,同步異步與阻塞非阻塞並無關係。同步異步主要是事情作完之後,如何進行處理、或者說關注的是一種消息通訊機制。
同步的狀況下,是由處理消息者本身去等待消息是否被觸發;
而異步的狀況下是由觸發機制來通知處理消息者數組

舉例:
因此同步異步能夠說是對被請求方來講的,被請求者使用什麼方式來告知處理結果promise

  • 思考,思考。。。。。。。,好了,有答案了,當場告訴你 -------- 同步
  • 這個問題須要一點時間,你先作點別的,等我想好了,去找你。 --------異步

阻塞非阻塞,主要是對於請求者而言的dom

  • 阻塞:發出請求等待結果返回,而後再處理後續的事情
  • 非阻塞:發出請求不等待結果返回,能夠接着作後續的事情

上代碼:異步

/**當咱們new Promise會獲得一個Promise對象,該對象會有一個任務要完成,同時該對象會維護一個狀態
PromiseStatus
    1:pending:正在處理
    2:resolved:已完成
    3:rejected:失敗*/

let p1 = new Promise(function(resolve,reject){

    /**要作的事情經過一個函數來完成,該函數會接收兩個值
    resolve
    reject
    這兩個參數都是一個函數,當咱們調用他們的時候,會改變當前任務的狀態
    resolve() => resolved
    reject() => rejected */

    setTimeout(() => {
            var a = Math.random();
            if(a < 0.5){
                console.log(a,'p1失敗')
                reject(a)
            }else{
                console.log(a,'p1成功')
                resolve(a)
            }
        },1000)
})

/**Promise對象還有一個then方法,當前任務成功的時候,會調用該方法,並執行該方法傳入函數參數
then方法接收兩個參數,它們都是函數
    第一個參數是當前狀態爲resolved時候執行
    第二個參數是當前狀態爲rejected時候執行*/

p1.then(a => {
      console.log('成功',a)
 },a => {
       console.log('失敗',a)
 })
       
/**雖然then方法中的參數接收兩個
    一個是成功的callback
    一個是失敗的callback
    可是,在書寫的時候,若是每個then都傳這兩個callback的話,編寫過程太麻煩,爲了可以統一的處理失敗Pormise對象又提供了一個新的方法:catch,catch方法也接收一個callback
    只要有一個Promise的狀態變成了rejected,那麼就會被catch方法捕獲,執行catch的callback*/

.then((a) => {
    return new Promise((resolve,reject) => {
        setTimeout(() => {
                a *= a; 
                console.log(a,'p1成功')
                reject(a);
            },1000)
    })
}).then((a) => {
    console.log(a,'p1的then裏成功')
}).catch((a) => {
    console.log(a,'失敗捕獲')
})

看打印出來的結果:
當p1中的隨機數a < 0.5時,就直接進入catch裏捕獲到失敗了,後面的then都不會執行函數

當p1中的隨機數a > 0.5時,就進入到第一個then裏,第一個then裏又有一個promise對象,可是執行的是reject函數,因此就會直接到catch裏捕獲到失敗code

情形:在一個Promise任務中須要處理多個異步任務,這多個的異步任務是同時進行的,可是執行時間是不肯定的,後續的任務須要這幾個異步任務所有完成以後在執行,這時候就須要用到Promise裏面提供的all方法來實現orm

var p1 = new Promise((resolve,reject) => {
    let a = 1;
    setTimeout(() => {
        a++;
        resolve(a);
    },Math.random() * 1000)
})

var p2 = new Promise((resolve,reject) => {
    let b = 2;
    setTimeout(() => {
        b++;
        resolve(b);
    },Math.random() * 1000)
})

/**把兩個不一樣的異步任務分別包裝在一個Promise對象裏,而後調用Promise對象靜態方法all,把上面多個不一樣異步Promise做爲數組傳遞給all方法的參數,當多個異步任務的狀態都變成resolve,那麼all的狀態纔是resolved,可是隻要有一個異步任務的狀態變成了rejected,那麼all的狀態就會變成rejected*/

Promise.all([p1,p2]).then(([a,b]) => {
    console.log(a,b)
}).catch((err) => {
    console.log(err)
})

打印臺:對象

over~blog

相關文章
相關標籤/搜索