Promise 是異步編程的解決方案,可以簡化多層回調嵌套,表明了將來某個將要發生的事件。
Promise是一個構造函數,自己有all、reject、resolve,原型上有then、catch。故Promise new出來的對象確定就有then、catch。ajax
promise接收的參數是一個匿名函數,匿名函數也有二個參數resolve/reject。
resolve表示異步操做執行成功後的回調函數,並將異步操做的結果,做爲參數傳遞出去;
b. reject表示異步操做執行失敗後的回調函數,並將異步操做的問題,做爲參數傳遞出去;
promise有三種狀態:pending(等待態),fulfiled(成功態),rejected(失敗態);狀態一旦改變,就不會再變。編程
then方法能夠接受兩個回調函數做爲參數。第一個回調函數是Promise對象的狀態變爲resolved時調用,第二個回調函數是Promise對象的狀態變爲rejected時調用。其中,第二個函數是可選的,不必定要提供。這兩個函數都接受Promise對象傳出的值做爲參數。數組
2)catch方法在執行resolve的回調時,若是拋出異常了(代碼出錯了),那麼並不會報錯卡死js,而是會進到這個catch方法中。promise
let p = new Promise((resolve, reject) => { console.log('====') //作一些異步操做 setTimeout(function(){ var num = Math.ceil(Math.random()*10); //生成1-10的隨機數 if(num < 5 ){ resolve(num); } else{ reject('數字大於等於5'); } }, 1000); }); p.then((data) => { console.log('resolved',data); console.log(somedata); },(err) => { console.log('rejected',err); } ).catch((err) => { console.log('catch',err); }); // 當即輸出=====
1s後根據num判斷輸出resolved 三、rejected 數字大於等於5dom
應用場景:異步
使用promise實現超時處理、封裝處理ajax請求 異步編程
2) Promise.all。提供了並行執行異步操做的能力,而且在全部異步操做執行完後才執行回調.函數
能夠將多個Promise實例包裝成一個新的Promise實例spa
同時,成功和失敗的返回值是不一樣的,成功的時候返回的是一個結果數組(數據順序和Promise.all接收到的數組順序是一致的,即p1的結果在前,即使p1的結果獲取的比p2要晚),而失敗的時候則返回最早被reject失敗狀態的值。code
應用場景:
Promse.all在處理多個異步處理時很是有用,好比說一個頁面上須要等兩個或多個ajax的數據回來之後才正常顯示,在此以前只顯示loading圖標。
一些遊戲類的素材比較多的應用,打開網頁時,預先加載須要用到的各類資源如圖片、flash以及各類靜態文件。全部的都加載完後,咱們再進行頁面的初始化。
3) Promise.race([p1, p2, p3])裏面哪一個結果得到的快,就返回那個結果,無論結果自己是成功狀態仍是失敗狀態。
應用場景:
能夠用race給某個異步請求設置超時時間,而且在超時後執行相應的操做