當我們使用ajax時,異步回呼,當請求過多時,很容易形成回呼地域,使我們很難維護,不易拓展功能和管理,在jQuery中實作里管理異步回呼deferred,同樣,ES6原生的js也提供了管理異步回呼的方法,使其能線性的拓展,方便我們管理和維護,
Promise是ES6內置的建構式,使用時要使用new創建一個promise物件,接收一個函式作為引數,這個函式里面的代碼是同步執行的,
promise有三個狀態,pending:初始狀態,fulfilled 成功狀態 ,rejected 失敗狀態,
當在傳入的函式里執行某些操作時,我們可以觸發他的成功,或失敗狀態,成功執行某些操作,失敗執行某些操作,這些操作在then方法里面承諾,
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的回傳值會作為第二個回呼函式的引數,
let oP = new Promise((resolve,reject)=>{
resolve(1);
})
oP.then((val)=>{
console.log('ok' + val);
//throw new Error('error');
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函式的失敗函式,捕獲錯誤,
在兩個then之間存在空then時,會直接忽視,仍然會獲取到上一個函式的引數,
promise.all([]),引數接收一個(可迭代帶有iterator屬性的就是可迭代的)promise物件陣列,當所有promise物件都成功就回傳一個結果陣列,當有一個失敗,就呼叫失敗函式,回傳最先被reject失敗狀態的值,執行后回傳一個新的promise實體,
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);
})
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/167014.html
標籤:JavaScript
