當咱們使用ajax時,異步回調,當請求過多時,很容易造成回調地域。使咱們很難維護,不易拓展功能和管理。在jQuery中實現裏管理異步回調deferred,一樣,ES6原生的js也提供了管理異步回調的方法。使其能線性的拓展,方便咱們管理和維護。ajax
Promise是ES6內置的構造函數,使用時要使用new建立一個promise對象。接收一個函數做爲參數。這個函數裏面的代碼是同步執行的。數組
promise有三個狀態,pending:初始狀態。fulfilled 成功狀態 。rejected 失敗狀態。promise
當在傳入的函數裏執行某些操做時,咱們能夠觸發他的成功,或失敗狀態。成功執行某些操做。失敗執行某些操做。這些操做在then方法裏面承諾。dom
then 方法傳入兩個參數函數,分別對應着成功的回調函數和失敗的回調函數。而且在then中註冊的函數是異步執行的,及會放在任務隊列中,等主任務執行完畢在執行,可是會陷入settimeout,setInterval等異步任務,(任務隊列的任務分爲主任務和微任務,微任務會先入主任務執行)。 所以下方的代碼執行時0 2 1。異步
then方法返回一個新的promise對象。這提供了鏈式調用,是異步任務能夠線性的方式書寫。函數
let oP = new Promise((resolve,reject)=>{
//setTimeout(() => { // Math.random() * 100 > 60 ? resolve('ok') : reject('no'); i // }, 1000);
console.log(0);
resolve(1);
console.log(2);
})
oP.then((val)=>{
console.log(val);
return new Promise((res,rej)=>{
rej(2);
});
}).then(function(val){
console.log(val);
},function(reason){
console.log(reason);
})
then的鏈式調用。當觸發第一個then的成功函數(第一個函數沒有拋出錯誤)後會調用第二個then的成功函數。而且return的返回值會做爲第二個回調函數的參數。spa
let oP = new Promise((resolve,reject)=>{
resolve(1);
})
oP.then((val)=>{
console.log('ok' + val);
return val;
},function(reason){
console.log('no' + reason);
return val;
}).then(function(val){
console.log('ok' + val);
},function(reason){
console.log('no' + reason);
})
// 1 OK
// 1 OK
當觸發第一個函數拋出錯誤時,會調用第二個then函數的失敗函數,捕獲錯誤。code
在兩個then之間存在空then時,會直接忽視,仍然會獲取到上一個函數的參數。對象
promise.all([]),參數接收一個promise對象數組,當全部promise對象都成功就返回一個結果數組,當有一個失敗,就調用失敗函數,返回最早被reject失敗狀態的值,執行後返回一個新的promise實例。blog
function text(x){
return new Promise((res,rej)=>{
setTimeout(() => {
Math.random() * 100 > 50 ? res(x) : rej(x);
}, 100);
})
}
let oP = Promise.all([text(),text(),text()]);
oP.then(function(val){
console.log(val);
},(reason)=>{
console.log(reason);
})
promise.race([]),參數接收一個promise數組,當那個promise對象結果或得的快,就返回那個最快的結果。
let oP = Promise.race([text('a'),text('b'),text('c')]);
oP.then(function(val){
console.log(val);
},(reason)=>{
console.log(reason);
})