Promise练习题

举报
骁M_M 发表于 2021/04/25 12:10:10 2021/04/25
【摘要】 题目一Promise.resolve(1) .then((data) => { console.log(data) return 2 }) .catch((err) => { return 3 }) .then((data) => { console.log(data) })本题考查promise静态方法resolve作用:有时需要将现有对象转为Promi...

题目一

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 回调放在进行宏任务队列的队尾,若队列非常长,那么回调迟迟得不到执行,造成的效果就是应用卡顿。所以就引入了微任务。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。