then 方法链式调用识别 Promise 对象自返回
then中不能返回自身,不然会循环调用。因判断返回的Promise是否与自身相等时Promise还没有new出来,所以要用异步代码来处理(定时器)。
捕获错误及 then 链式调用其他状态代码补充
当执行器中的代码发生错误时,需要捕获到错误(在构造函数中用try,catch捕获错误)。当then中出现错误,也需要捕获(在返回的新Promise中用try,catch进行捕获,包括成功,失败和异步情况)。
将 then 方法的参数变成可选参数
若then中没有参数,则将状态传递下去(resolve中直接返回,reject中throw原因)。
Promise.all 方法的实现
Promise.all是解决异步并发问题的,它允许我们按照异步代码掉用的顺序得到异步代码执行的结果且返回一个promise,且返回的promise中若没有reject则resolve对应的数组,有reject则reject那个原因。其中要注意异步操作,可用index与传入数组的长度来判断是否resolve。
Promise.resolve 方法的实现
Promise.resolve的作用就是将给定的值转换为promise对象,若传入promise对象直接返回,若为普通值则返回promise,将对应的值传入resolve。
finally 方法的实现
finally中的回调不管promise是reject还是resolve都会被执行,并返回一个promise且后面的then链式调用需要等待finally中代码执行完成才能执行,可用Promise.resolve来实现(返回)。
catch 方法的实现
调用then方法时可以不传递失败回调,而可用catch来捕获执行catch中的回调函数。可以在catch中返回then后的promise,其中then的第一个参数没用,可为undefined,第二个参数为对应的失败回调。
手写 Promise 源码
共5道,答对5题
100
总分100分
1. 单选题[单选题]关于 then 方法, 以下选项中说法不正确的是(20分)
- AA: 判断 promise 对象状态, 注册并执行成功状态和失败状态的回调函数
- BB: then 方法可以链式调用
- CC: then 方法的成功回调函数可以继续返回 Promise 对象, 失败回调函数中不可以
- DD: 同一个 Promise 对象中的 then 方法可以被多次调用
回答正确 +20分
2. 单选题[单选题]执行器函数的 resolve 参数的作用是什么(20分)
- AA: 重置 Promise 对象状态
- BB: 创建 Promise 对象
- CC: 将 promise 状态更改为成功
- DD: 将 promise 状态更改为失败
回答正确 +20分
3. 单选题[单选题]关于 Promise.all 方法以下说法不正确的是(20分)
- AA: 返回值是 Promise 对象
- BB: 参数为数组, 数组中只能传递返回 promise 对象的异步API
- CC: 参数为数组, 数组中可以传递普通值和 promise 对象
- DD: 解决异步并发、允许按照异步API调用顺序得到异步API的执行结果
回答正确 +20分
4. 单选题[单选题]以下选项中关于 Promise 状态说法不正确的是(20分)
- AA: 在 Promise 中有三种状态, 分别为等待, 成功, 失败
- BB: 状态只能从等待变成成功, 等待变成失败
- CC: 在 Promise 中状态确定后, 可以再次更改
- DD: Promise 执行器中的 resolve 参数和 reject 参数可以更改 Promise 状态
回答正确 +20分
5. 单选题[单选题]以下关于 finally 方法说法不正确的是(20分)
- AA: 在 finally 方法中, 可以获取到 promise 对象的执行结果
- BB: 无论当前的 Promise 对象状态是成功的还是失败的, finally 方法中传入的回调函数都会得到执行
- CC: finally 方法的返回值是 Promise 对象, 所以在调用方法后还可以链式调用 then 方法
- DD: 在 finally 方法的回调函数中可以继续返回 Promise 对象
回答正确 +20分