说明
最近在复习 Promise 的知识,所以就做了一些题,这里挑出几道题,大家一起看看吧。
题目一
const promise = new Promise((resolve, reject) => {
console.log(1);
resolve();
console.log(2);
})
promise.then(() => {
console.log(3);
})
console.log(4);
解析
首先 Promise 新建后立即执行,所以会先输出 1,2,而 Promise.then()
内部的代码在 当次 事件循环的 结尾 立刻执行 ,所以会继续输出4,最后输出3。
答案
1
2
4
3
题目二
const promise = new Promise((resolve, reject) => {
resolve('success1');
reject('error');
resolve('success2');
});
promise.then((res) => {
console.log('then:', res);
}).catch((err) => {
console.log('catch:', err);
})
解析
resolve 函数
将 Promise 对象的状态从“未完成”变为“成功”
(即从 pending 变为 resolved
),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
reject 函数
将 Promise 对象的状态从“未完成”变为“失败”
(即从 pending 变为 rejected
),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
而一旦状态改变,就不会再变。
所以 代码中的reject('error');
不会有作用。
Promise 只能 resolve 一次,剩下的调用都会被忽略。
所以 第二次的 resolve('success2');
也不会有作用。
答案
then: success1
题目三
Promise.resolve(1)
.then(2)
.then(Promise.resolve(3))
.then(console.log)
解析
Promise.resolve
方法的参数如果是一个原始值,或者是一个不具有 then
方法的对象,则 Promise.resolve
方法返回一个新的 Promise
对象,状态为resolved
,Promise.resolve
方法的参数,会同时传给回调函数。
then
方法接受的参数是函数,而如果传递的并非是一个函数,它实际上会将其解释为 then(null)
,这就会导致前一个 Promise
的结果会穿透下面。
答案
1
题目四
红灯三秒亮一次,绿灯一秒亮一次,黄灯2秒亮一次;如何让三个灯不断交替重复亮灯?(用Promse实现)三个亮灯函数已经存在:
function red() {
console.log('red');
}
function green() {
console.log('green');
}
function yellow() {
console.log('yellow');
}
解析
红灯三秒亮一次,绿灯一秒亮一次,黄灯2秒亮一次,意思就是3秒,执行一次 red 函数,2秒执行一次 green 函数,1秒执行一次 yellow 函数,不断交替重复亮灯,意思就是按照这个顺序一直执行这3个函数,这步可以就利用递归来实现。
答案
function red() {
console.log('red');
}
function green