js進階--Promise-10
Promise
Promise是es6新增的一個類
用處:將非同步程式碼,以同步的方式寫出來,避免了回撥地獄
使用的時候要new一下Promise
new的時候裡面傳一個函式,函式有兩個形參,第一個代表成功,第二個代表失敗
let p1=new Promise((resolve,reject)=>{
resolve();//假設第一個函式執行
reject();//第二個代表失敗
});
Promise有三個狀態
pending
等待態fulfilled
成功態rejected
失敗態- Promise
在new的時候立即執行
,如果不指定狀態的話,預設為等待態pending
狀態只能改變一次
,要麼pending–>fulfilled或者pending–>rejected- 如果寫了reject也寫了resolve只執行前面的,
因為狀態只能改變一次
resolve代表成功執行,reject代表失敗執行
then
例項.then()
then裡面可以放兩個函式,第一個是成功
p1.then(()=>{
console.log("成功")
// resolve執行,那這個就執行
},()=>{
//reject執行,那這個就執行
console.log("失敗")
})
前面的.then裡return如果不是promise例項的話,那麼會把return的東西當實參傳遞給下一個.then
catch
catch是promise原型上的一個方法,當任何一個promise的例項是失敗態的時候就會執行catch函式
如果回撥函式執行的時候發生了錯誤,那當前promise的例項會預設為失敗態
catch裡面的形參會接受報錯內容,或者失敗態的實參
let p1=new Promise((resolve,reject)=>{
console.log(a);
})
p1.then(()=>{
console.log("成功態")
},()=>{
console.log("失敗態")
})//"失敗態"
特殊情況
只要下面的then有失敗態的函式,就先執行失敗態的函式,沒有才執行catch
let p1=new Promise((res,rej)=>{
res();
});
p1.then((res)=>{
console.log(res,100);
return new Promise((res,rej)=>{
rej(111);
})
}).then(()=>{},()=>{})
.catch((res)=>{
console.log(res,200);
}).finally(()=>{
console.log("最後")
})
//undefined 100 111 200 最後
let p1=new Promise((res,rej)=>{
res();
});
p1.then((res)=>{
console.log(res,100);
return new Promise((res,rej)=>{
rej(111);
})
}).then(()=>{},()=>{})
.catch((res)=>{
console.log(res,200);
}).finally(()=>{
console.log("最後")
})
//undefined 100 最後
let p1=new Promise((resolve,reject)=>{
console.log(a);
})
p1.then(()=>{
console.log("成功態")
},()=>{
console.log(c)//讓他出錯
}).catch((aa)=>{console.log(aa,200)})//ReferenceError: c is not defined at <anonymous>:7:17 200
finally
除非為等待態,否則不論成功失敗,都會執行finally
finally方法的回撥函式不接受任何引數
let p1=new Promise((resolve,reject)=>{
console.log(a);
})
p1.then(()=>{
console.log("成功態")
},()=>{
console.log("失敗態")
}).catch((error)=>{console.log(error)}).finally(()=>{console.log(888)})//失敗態 888
Promise.all([])
all裡面的陣列可以放promise例項
,等裡面的全部執行完畢
,會返回一個態度(成功態,或失敗態),陣列內全部成功all才返回成功態,有一個失敗就位失敗態
- 如果
all為成功態,那麼陣列內所有promise的例項的返回值會傳遞給.then裡面的成功態
,如果失敗,會把第一個失敗的傳參傳遞給.then裡的失敗態
Promise.all的引數不一定是promise的例項,是別的值也可以,他內部會把當前的值轉換成成功態的promise例項
let p1=new Promise((resolve,reject)=>{
resolve(100);
})
let p2=new Promise((resolve,reject)=>{
resolve(200);
})
let p3=new Promise((resolve,reject)=>{
resolve(300);
})
const p=Promise.all([p1,p2,p3]);
p.then((res)=>{
console.log(res,"成功態")// (3) [100, 200, 300] "成功態"
},(rej)=>{
console.log("失敗態")
})
Promise.race([])
[]裡的promise例項中
誰先執行完畢
,那麼這個先執行完成的是什麼態那就是什麼態
(成功,失敗,等待),返回值也只接收這一個,如果為等待態,那麼就不執行.then
let p1=new Promise((resolve,reject)=>{
setTimeout(()=>{ resolve(100);},1000)
})
let p2=new Promise((resolve,reject)=>{
// resolve(200);
setTimeout(()=>{},100)
})
let p3=new Promise((resolve,reject)=>{
// resolve(300);
})
const p=Promise.all([p1,p2,p3]);
p.then((res)=>{
console.log(res,"成功態")
},(rej)=>{
console.log("失敗態")
})
//Promise {<pending>}
Promise.resolve()
他的返回值就是一個已經
成功的
promise的例項
let pp=Promise.resolve(100);
let pp=new Promise((res,rej)=>{
res(100);
})
//兩者相等
Promise.reject()
他的返回值就是一個已經
失敗
的promise的例項
let pp=Promise.reject(100);
let pp=new Promise((res,rej)=>{
rej(100);
})
//兩者相等
相關文章
- js 進階知識JS
- js物件建立進階JS物件
- JS進階系列 --- 繼承JS繼承
- 04--JS04--進階JS
- web前端進階篇(一 )JSWeb前端JS
- js面試題(進階)梳理JS面試題
- JS進階系列-JS執行期上下文(一)JS
- JS進階(一)(物件導向、原型)JS物件原型
- 10分鐘快速進階rollup.jsJS
- 前端進階之 JS 抽象語法樹前端JS抽象語法樹
- JS進階系列 --- ajax請求優化JS優化
- 《大前端進階 Node.js》系列 雙十一秒殺系統(進階必看)前端Node.js
- JS進階(3):人人都能懂的繼承JS繼承
- 「前端進階」JS中的記憶體管理前端JS記憶體
- Python爬蟲進階之JS逆向入門Python爬蟲JS
- JS進階(2):人人都能懂的原型物件JS原型物件
- js基礎進階–從ajax到fetch的理解JS
- Next.js腳手架進階 —— 部署上線JS
- Next.js 腳手架進階 —— Zeit Now部署JS
- js進階-設計模式: 釋出訂閱模式JS設計模式
- Three.js進階篇之6 - 碰撞檢測JS
- Three.js進階篇之5 - 粒子系統JS
- Three.js 進階之旅:新春特典-Rabbit craft go ?JSRaftGo
- Three.js 進階之旅:全景漫遊-高階版線上看房 ?JS
- Three.js 進階之旅:全景漫遊-初階移動相機版JS
- 前端進階(12) – css 的弱化與 js 的強化前端CSSJS
- Python爬蟲進階之JS逆向土地市場網!Python爬蟲JS
- JS進階(1) —— 人人都能懂的建構函式JS函式
- Three.js 進階之旅:物理效果-碰撞和聲音 ?JS
- 前端進階(11) – js 資料結構型別擴充套件:immutable-js前端JS資料結構型別套件
- js高階JS
- Next.js腳手架進階 — 完美契合ant-designJS
- Three.js進階篇之7 - 3D宇宙特效JS3D特效
- Js高階APIJSAPI
- JS高階三JS
- cocos2d - JS 進階主題 call() 、apply() 和 bind() 解析JSAPP
- 重溫一下 JS 進階需要掌握的 13 個概念JS
- [Vue.js進階]從原始碼角度剖析vue-router(上)Vue.js原始碼