📜  带有超时 js 的承诺 - Javascript (1)

📅  最后修改于: 2023-12-03 15:25:30.413000             🧑  作者: Mango

带有超时的承诺 - Javascript

在 Javascript 中,Promise(承诺)是一种处理异步操作的对象,用于异步编程。在某些情况下,我们可能需要在一定时间内解决 Promise,如果超时则需要进行相应的处理。实现这种带有超时的 Promise 可以通过 Promise.race 和 setTimeout 方法来实现。

Promise.race

Promise.race 用于将多个 Promise 包装成一个 Promise,并返回最先解决的 Promise。

Promise.race([promise1, promise2, promise3])
  .then(result => {
    // 最先解决 Promise 的结果
  })
  .catch(error => {
    // 所有 Promise 都失败的错误
  });
setTimeout

setTimeout 方法用于设置一个定时器,通过指定时间来延迟代码的执行。

setTimeout(() => {
  // 在指定的延迟之后执行的代码
}, delay);
带有超时的 Promise

结合 Promise.race 和 setTimeout 方法,我们可以实现带有超时的 Promise:

function promiseWithTimeout(promise, timeout) {
  let timeoutPromise = new Promise((_, reject) => {
    setTimeout(() => {
      reject('Promise timed out');
    }, timeout);
  });

  return Promise.race([promise, timeoutPromise]);
}
上面的代码中,我们定义 `promiseWithTimeout` 函数,用于将一个 Promise 包装成一个带有超时的 Promise。

首先,我们创建一个新的 Promise `timeoutPromise`,用于在超时的情况下进行拒绝操作。在 `timeout` 毫秒之后,我们会将 `timeoutPromise` 拒绝,并返回一个错误信息。

接着,我们使用 Promise.race 方法将原始的 Promise 和 `timeoutPromise` 包装成一个新的 Promise,用于返回最先解决的 Promise。如果 `promise` 在超时之前被解决,则返回 `promise` 的解决结果,否则返回 `timeoutPromise` 的拒绝错误。

现在,我们可以使用 `promiseWithTimeout` 函数来处理带有超时的异步操作:

```javascript
promiseWithTimeout(fetch('https://example.com'), 5000)
  .then(response => {
    // 处理成功响应
  })
  .catch(error => {
    // 处理失败响应或超时错误
  });

这里我们使用 promiseWithTimeout 函数来包装一个 HTTP 请求。如果请求在 5 秒内得到了响应,则使用 then 来处理成功响应,否则使用 catch 来处理失败响应或超时错误。

带有超时的 Promise 可以帮助我们更好地控制异步操作的执行时间,并提高程序的健壮性。