說說promise吧, promise 承諾。Promise的理解就是 我對你作出承諾,我怎麼怎麼,而後我有可能成功,我作到了, 有可能失敗, 我沒作到, 就是這麼個東西.(說的玄一點, 這是一個異步流程控制的一個東東, 至於什麼是異步流程控制?我不知道)promise
new Promise((resolve, reject)=>{})
Promise的狀態變化有兩種, 從pending —> fulfilled或者 pending—>rejected異步
pending 是初始的狀態, fulfilled 是成功的狀態, 剩下的就是失敗的狀態rejected函數
Promise會當即執行, 可是狀態的改變須要咱們來操做。prototype
let abcc = new Promise((resolve, reject)=> { console.log('當即執行了') setTimeout(()=>{ resolve('ccc') },1000) setInterval(()=> { console.log(abcc) },200) console.log('當即執行了2') })
thenrest
當Promise的狀態發生改變,使用then方法來觸發對應的處理方法.code
兩個參數: then方法包含兩個參數, 對應當Promise的狀態爲fulfilled和rejected的回調函數對象
省略參數: 將建立一個沒有其餘處理程序的新的Promise,繼承Promise最終的狀態, then被調用, 第幾個參數省略,Promise將採用那個狀態繼承
因爲then方法返回的是一個新的Promise對象, 因此不會影響到當前的Promise對象,因爲返回來的是Promise,因此then後面能夠then, then, then….無窮無盡,這樣完美的避免了 回調地獄.回調函數
let o1 = new Promise((resolve,reject) => { resolve(1) }) o1.then((value)=>{ console.log('value'+ value) // 1 console.log(o1) // resolved 1 value +=1; return value; }).then((value)=>{ console.log(value) //2 console.log(o1) //resolved 1 })
catchio
由於咱們寫的是程序, 因此常常要考慮程序出錯的緣故. 就把rejected的函數捕捉給暴露出來了就是所謂的catch, 當狀態變爲rejected的時候, catch被調用
其實catch就是下面的縮寫
Promise.prototype.then(undefined, onRejected)
看下下面這個
var p1 = new Promise(function(resolve, reject) { resolve('Success'); }); p1.then(function(value) { console.log(value); // "成功!" throw 'oh, no!'; or return Promise.reject('oh no ') }).catch(function(e) { console.log(e); // "oh, no!" }).then(function(){ console.log('after a catch the chain is restored'); }, function () { console.log('Not fired due to the catch'); });
catch返回的Promise狀態, 因爲catch是then(undefined, onrejected)的縮寫, 第一個參數爲空, 因此catch返回的Promise狀態爲成功
Promise.reject(reson)
返回一個用reason拒絕的Promsie
let o = Promise.reject('sss'); o.catch((reason) => { console.log(reason) // sss }).then(()=> { console.log('resolve') // 返回這個 理由在上面本身找 }, ()=> { console.log('reject') })
Promise.resolve()
Promise.resolve(value); 正常解析 Promise.resolve(promise); 根據promise的狀態來往下傳遞 Promise.resolve(thenable); 根據then的狀態來往下傳遞 Promise.resolve("Success").then(function(value) { console.log(value); // "Success" }, function(value) { // 不會被調用 })
Promise.all()
當全部參數中的promise都完成, 或者任意一個promise的狀態變成reject,返回promise
let o1 = new Promise((resolve,reject)=>{ resolve('1') }) let o2 = new Promise((resolve,reject)=>{ resolve('2') }) let o3 = new Promise((resolve,reject)=>{ setTimeout(()=> { resolve('3') }, 3000) }) Promise.all([o1, o2, o3]).then((value)=>{ console.log(value) }).catch((reason)=>{ console.log(reason) })
Promise.race()
和all相反, 只要有一個狀態改變, 就會返回
能夠講上面的all換成race來玩玩.