Promise练习题
题目一
Promise.resolve(1)
.then((data) => {
console.log(data)
return 2
})
.catch((err) => {
return 3
})
.then((data) => {
console.log(data)
})
本题考查promise静态方法resolve
作用:有时需要将现有对象转为Promise对象,Promise.resolve方法就起到这个作用
Promise.resolve(1) 等价于 new Promise (resolve => resolve (1))
题目中的参数不是具有then方法的对象且根本不是对象,Promise.resolve方法返回一个新的Promise对象,返回Promise实例的状态从生成起就是Resolved,所以回调函数会立即执行。Promise.resolve方法的参数会同时传给回调函数。
答案:1 2
题目二
const promise = new Promise((resolve, reject) => {
console.log(1)
resolve()
console.log(2)
})
promise.then(() => {
console.log(3)
})
console.log(4)
记住 new Promise 里的参数函数,是同步被执行的,故而先输出 1,2.
resolve 后还需要等待进入下一个事件循环。then 把参数函数推入微任务队列,并不直接执行。输出 4,接着事件循环进入下一轮,输出 3.
答案:1 2 4 3
题目三
const promise = new Promise((resolve, reject) => {
resolve('success1')
reject('error')
resolve('success2')
})
promise
.then((data) => {
console.log(then:data)
})
.catch((err) => {
console.log(err)
})
答案: then:success1
本题考查点:
构造函数中的 resolve 或 reject 只有第一次执行有效,多次调用没有任何作用,呼应代码;promise 状态一旦改变则不能再变。
知识点:Promise 构造函数接受一个函数,该函数的两个参数分别是resolve和reject,他们是两个函数,由javascript引擎提供,不用自己部署。
resolve函数作用:将Promise对象的状态从"未完成"变为"成功"(pengding->resolved),在异步操作成功时调用,并将异步操作的结果作为参数传递出去;
reject函数作用:将Promise对象的状态从"未完成"变为"失败"(pengding->rejected),在异步操作失败时调用,并将异步操作的结果作为参数传递出去;
Promise实例生成以后,可以用then方法分别指定Resolved状态与Rejected状态的回调函数。第二个函数是可选的,这两个函数都接受Promise对象传出的值作为参数。
then是Promise原型上的方法,它的作用是为Promise实例添加状态改变时的回调函数,它返回的是一个新的Promise实例(不是原来那个实例,因此可以使用链式调用)如果传的不是函数,会返回一个空的Promise对象。
题目四
Promise.resolve(1)
.then(2)
.then(Promise.resolve(3))
.then(console.log)
答案:1
考察点
then 方法只接收函数,如果不是函数,就会透传,(只能接受函数类型的参数,非函数类型的参数都会忽略)所以前两个then方法都无效,只有第三个then方法是有效的
题目五
new Promise((resolve,reject)=>{
console.log(3);
let p = new Promise((resolve, reject)=>{
console.log(7);
setTimeout(()=>{
console.log(5);
resolve(6);
},0)
resolve(1);
});
resolve(2);
p.then((arg)=>{
console.log(arg);
});
}).then((arg)=>{
console.log(arg);
});
console.log(4);
答案:3 7 4 1 2 5
考察点
宏任务:DOM事件回调、Ajax回调、定时器回调
微任务:Promise回调、Mutation回调
宏任务需要在所有微任务执行完之后再去执行
顺序:同步队列=>微任务=>宏任务
Promise的构造函数中是同步任务,所以内部的then方法先执行,外部的then方法后执行,所以在微任务队列中,内部then方法的回调函数先触发,外部then方法的回调函数后触发,resolve 的作用是将promise的状态变更为完成态,并且状态变更后,不在接收变更状态的消息,resolve(6) 运行前,resolve(1)已经执行
为什么 promise 需要引入微任务
Promise 中的执行函数是同步进行的,但是里面存在着异步操作,在异步操作结束后会调用 resolve 方法,或者中途遇到错误调用 reject 方法,这两者都是作为微任务进入到 EventLoop 中。但是你有没有想过,Promise 为什么要引入微任务的方式来进行回调操作?
若 promise 回调放在进行宏任务队列的队尾,若队列非常长,那么回调迟迟得不到执行,造成的效果就是应用卡顿。所以就引入了微任务。
- 点赞
- 收藏
- 关注作者
评论(0)