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点推送当天的参考答案
- 注 绝不仅限于完成当天任务,更多是查漏补缺,学习群内其它同学优秀的答题思路