18-2 实现给定时间切换状态(拼多多面试题)
实现 promiseSetTimeout(拼多多面试题)
题目:实现一个promisesetTimeout方法,该方法接收两个参数:第一个参数为promise,第二个参数为number类型
结果需满足:
1)若Promise
在第二个参数给定的时间内处于pending
状态,则返回一个rejected
的Promise
,其reason为new Error('promise time out')
2)若Promise
在第二个参数给定的时间内处于非pengding
状态,则返回该Promise
题目拆解:
1、 超时函数:间隔 time 后抛出 error 的 Promise(即上文提及的 sleep 函数)
2、Promise.race(核心) :只要有一个参数的 promise 的状态改变,整个返回的 Promise 状态就会跟着改变
3、『Promise.race 的结果获取需要使用 then:`Promise.race([]).then(res = > ...)`』
// 之前往上找的解法
// 超时函数 - 返回一个自定义睡眠时长的,用于抛出错误的 Promise
let timeout = (time) => new Promise((resolve, reject) => {
setTimeout(reject, time, new Error('promise time out'));
})
// 核心:通过 Promise.race 改变返回的 Promise 结果的状态
let promiseSetTimeout = async (promise, time) => {
return await Promise.race([promise, timeout(time)])
}
// 使用示例:构建一个 promise 作为第一个参数 - sleep 函数实现
let p = (time) => new Promise((resolve) => {
setTimeout(resolve, time, '111')
})
promiseSetTimeout(p(500), 1000).then(res => console.log(res))
// 自己写的 - 逻辑是一样的,但是,我喜欢
async function promiseSetTimeout2(promise, delay) {
return await Promise.race([
promise, new Promise((resolve, reject) => {
setTimeout(() => {
reject(new Error('promise time out'));
}, delay);
})
])
}
let p1 = (time) => new Promise((resolve) => {
setTimeout(() => {
resolve('p1');
}, time)
})
promiseSetTimeout2(p1(500), 1000).then((res) => {
console.log('输出', res);
});