-
promise概念
Promise
是異步編程的一種解決方案:從語法上講,promise是一個對象,從它可以獲取異步操作的消息;從本意上講,它是承諾,承諾它過一段時間會給你一個結果,其實是一個構造函數(shù),自己身上有all、reject、resolve,race這幾個方法,原型上有then、catch,finally等方法。promise有三種狀態(tài): pending(等待態(tài)),fulfiled(成功態(tài)),rejected(失敗態(tài));狀態(tài)一旦改變,就不會再變。創(chuàng)造promise實例后,它會立即執(zhí)行。 -
promise.prototytype.then():promise實例狀態(tài)改變的回調函數(shù),有兩個參數(shù):第一個是成功回調函數(shù),第二個是失敗回調函數(shù)。他會返回一個全新的promise,因此可以繼續(xù)then鏈式調用。
-
promise.prototype.catch():失敗回調函數(shù),狀態(tài)變?yōu)閞ejected執(zhí)行。相當于promise. prototytype.then(null/undifined,rejection),如果promise內發(fā)生了錯誤,但卻沒有定義catch(),這時運行到這一行代碼會報錯,但是不會影響到promise后面代碼的執(zhí)行
promise的幾種方法:
1.基礎用法:
new Promise((resolve, reject) => {
// resolve 成功的回調
// reject 失敗的回調
// 成功或者失敗只能存在一種狀態(tài),不能同事執(zhí)行兩個狀態(tài)
resolve('成功')
reject('失敗')
// then 是獲取Promise的resolve, reject狀態(tài)
}).then(res => {
// 成功
console.log(res);
}, error => {
// 失敗
console.log(error);
})
2.promise.finally():promise實例無論狀態(tài)是什么都會執(zhí)行的函數(shù),finally不接受任何參數(shù)。
const p1 = function () {
return new Promise((resolve, reject) =>{
// 失敗時
// reject("失敗了")
// resolve(2);
// 成功時
resolve(2)
reject("失敗了")
});
};
p1().then(res=> {
console.log(res);
}).catch(error=>{
console.log(error);
}).finally(()=>{
console.log('無論失敗或者成功都會走這個函數(shù)');
})
3.promise.all():將多個promise實例包裝成一個新的promise實例
const p1 = function () {
return new Promise((resolve, reject)=>{
resolve(1);
});
};
const p2 = function () {
return new Promise((resolve, reject)=>{
resolve(2);
});
};
const p3 = function () {
return new Promise((resolve, reject)=>{
// reject("失敗了")
resolve(3);
});
};
// Promise.all 所有封裝的Promise都成功才會成功,只要有一個失敗就會失敗
let result = Promise.all([p1(), p2(), p3()]).then(results=>{
console.log(results);//[1, 2, 3]
}).catch(error=>{
console.log(err);
// 當p3的reject("失敗了")被解開時控制臺會打印失敗了
})
4.promise.race():
// race() 把多個封裝的promise 組合起來,看誰跑的快
const p1 = function () {
return new Promise((resolve, reject)=>{
setTimeout(() => {
resolve(1);
}, 500)
});
};
const p2 = function () {
return new Promise((resolve, reject)=>{
setTimeout(() => {
resolve(2);
}, 400)
});
};
const p3 = function () {
return new Promise((resolve, reject)=>{
setTimeout(() => {
resolve(3);
}, 600)
});
};
//誰先執(zhí)行完成就先執(zhí)行回調,其余的將不會再進入race的任何回調,其余的沒有停止,自行執(zhí)行
let result = Promise.race([p1(), p2(), p3()]).then(results=>{
console.log(results);
}).catch(error=>{
console.log(error);
})
5.promise.any():文章來源:http://www.zghlxwxcb.cn/news/detail-407522.html
// 1. 只要有一個實例變成fulfilled,他就會變成fulfilled
// 2. 只有全部實例狀態(tài)都變成rejected,它才會變成rejected
const p1 = function () {
return new Promise((resolve, reject)=>{
resolve(5);
});
};
const p2 = function () {
return new Promise((resolve, reject)=>{
reject(2);
});
};
const p3 = function () {
return new Promise((resolve, reject)=>{
resolve(3);
});
};
let result = Promise.any([p1(), p2(), p3()]).then(results=>{
console.log(results);
// 5 因為p1成功了,只返回找到的第一個成功的,遇到reject會繼續(xù)向下尋找
}).catch(error=>{
console.log(error);
// 當三個return返回的都是reject時,控制臺打印AggregateError: All promises were rejected
})
6.promise.allSettled():等所有實例都返回結果,他的狀態(tài)就只會變成fulfilled文章來源地址http://www.zghlxwxcb.cn/news/detail-407522.html
const p1 = function () {
return new Promise((resolve, reject) => {
resolve(1);
});
};
const p2 = function () {
return new Promise((resolve, reject) => {
resolve(2);
});
};
const p3 = function () {
return new Promise((resolve, reject) => {
reject(3);
});
};
// Promise.allSettled無論成功或者失敗會把所有的狀態(tài)返回給results
// 沒有catch
let result = Promise.allSettled([p1(), p2(), p3()]).then(results => {
console.log(results);
})
到了這里,關于promise的原理和幾種使用方法的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!