20190123問:
如何理解es6中的Promise?
試題解析:考查對JS中同步非同步的理解,及工作中常用的使用場景
參考回答
js是單執行緒的,也就是說一次只能完成一個任務,為了解決這個問題,js將任務的執行模式分為兩種, 同步和非同步, 在es5中我們處理非同步只能通過的回撥的方式進行處理,在多層非同步中,回撥會一層一層巢狀,也就是所謂的回撥地獄,promise就是非同步程式設計的一種解決方案
Promise
特點:
- 物件的狀態不受外界影響, promise物件代表一個非同步操作,有三種狀態pendding(進行中), fulfilled(成功), rejected(失敗)
- 一旦狀態改變,就不會再變, 狀態的改變只有兩種可能, pendding =>
fulfilled及pendding =>
rejected
基本用法:
const promise = new Promise(function(resolve, reject) {
// ... some code if (/* 非同步操作成功 */){
resolve(value);
// 將狀態從pendding變成fulfilled
} else {
reject(error);
// 將狀態從pendding變成rejected
}
});
複製程式碼
promise 生成例項後可以使用then方法接收resolved狀態和rejected狀態的回撥函式
promise.then( ()=>
{
console.log('resolved')
}, () =>
{
console.log('rejected')
})複製程式碼
promise原型上具有catch方法, catch方法是rejection的別名, 用於指定發生錯誤時的回撥函式
promise.then( ()=>
{
console.log('resolved')
}, () =>
{
console.log('rejected')
}).catch( (err) =>
{
console.log('catch')
})複製程式碼
promise原型上具有finally方法,用於不管promise物件最後的狀態如何,都會執行的操作
promise.then( ()=>
{
console.log('resolved')
}, () =>
{
console.log('rejected')
}).finally( (err) =>
{
console.log('end')
})複製程式碼
Promise.all
Promise.all方法用於將多個 Promise 例項,包裝成一個新的 Promise 例項
簡單使用:
const p = Promise.all([p1, p2, p3]);
複製程式碼
特點:
- 引數都是promise例項,如果不是會呼叫promise.resolve方法將其轉為promise例項
- p的獎態由傳入的promise例項的狀態決定
- promise例項狀態都變成fulfilled,p狀態為fulfilled
- promise例項狀態一個變成rejected,p狀態為rejected
題後思考
為何實現一個promise
往期
JS每日一題: 前端的快取有哪些?都適用什麼場景?區別是什麼?
JS每日一題: Call,Apply,Bind的使用與區別,如何實現一個bind?
JS每日一題: 說說你對前端模組化的理解
JS每日一題: web安全攻擊手段有哪些?以及如何防範
關於JS每日一題
JS每日一題可以看成是一個語音答題社群
每天利用碎片時間採用60秒內的語音形式來完成當天的考題
群主在次日0點推送當天的參考答案
- 注 絕不僅限於完成當天任務,更多是查漏補缺,學習群內其它同學優秀的答題思路