实现promiseTimeout方法

前几天做了某公司的笔试题,其中有一道题目是这样:

实现一个promiseTimeout方法,该方法接收两个参数,第一个参数为promise,第二个参数为number类型。该方法的作用为:

  1. 若promise在第二个参数给定的时间内处于pending状态,则返回一个rejected的promise,其reason为new Error("promise time out")
  2. 若promise在第二个参数给定的时间内处于非pending状态,则返回值为promise

可以使用全部ES6语法。

看完题目之后就知道应该用Promise.race()来实现,可是我的写法最终都无法返回题目中想要的返回值,不过打印能打印出来,希望大佬们可以指点一下,感谢。

function promiseTimeout(promise, time) {
    let timeout = new Promise((resolve, reject) => {
        setTimeout(() => {
            reject(new Error("promise time out"))
        }, time)
    })
    Promise.race([promise, timeout]).then((value) => {
        // console.log(promise)
        return promise
    }, (reason) => {
        // console.log(reason)
        return reason
    })
}

我觉得原因应该是出在在回调函数中return并不能正常返回外部函数的返回值,但是不知道如何做改进。

阅读 3.9k
2 个回答

题主想复杂了吧

function promiseTimeout(p, timeout) {
    const timerPromise = new Promise((_, reject) => setTimeout(reject, timeout, new Error('promise time out')))
    return Promise.race([p, timerPromise]);
}

参考GitHub笔记ES6-Promise/Promise A+规范

扫了一眼,主要是三个问题:

  1. promiseTimeout 没返回值。
  2. 超时后应返回一个 rejected 的 Promise,而你在 .catch() 里返回的却一个 fulfilled 的 Promise(你相当于把异常捕捉后吞掉了、然后返回了 Promise.resolve(reason))。
  3. 原题要求是传入的 Promise 只要在指定时间内处于 “pending”状态下就不算超时,rejectedfulfilled 都是pending,而你在 .catch() 里并没有区分出到底是因超时导致的 rejected、还是传入的 Promise 本身导致的 rejected
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题