首先來講下同步異步與阻塞非阻塞的概念,同步異步與阻塞非阻塞並無關係。同步異步主要是事情作完之後,如何進行處理、或者說關注的是一種消息通訊機制。
同步的狀況下,是由處理消息者本身去等待消息是否被觸發;
而異步的狀況下是由觸發機制來通知處理消息者數組
舉例:
因此同步異步能夠說是對被請求方來講的,被請求者使用什麼方式來告知處理結果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