实现给定时间切换状态(拼多多面试题)

Posted by CodingWithAlice on April 13, 2021

18-2 实现给定时间切换状态(拼多多面试题)

实现 promiseSetTimeout(拼多多面试题)

题目:实现一个promisesetTimeout方法,该方法接收两个参数:第一个参数为promise,第二个参数为number类型

结果需满足:

1)若Promise在第二个参数给定的时间内处于pending状态,则返回一个rejectedPromise,其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);
});