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

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

带有超时的 js 虚假承诺 - Javascript

在编写异步任务的时候,Promise 已经是一个非常常用的方案了。但是,有些情况下,我们需要在任务执行过程中加入超时控制,以防止任务一直运行而导致造成问题。本文将介绍如何在 Promise 中加入超时控制。

实现思路

我们可以使用一个定时器,在一定时间后强制 reject Promise。因为 Promise 的执行状态只会从 pending 转变为 fulfilled 或者 rejected,所以可以安全地在 Promise 执行的过程中使用超时机制。

代码实现

我们可以编写一个带有超时控制的 Promise 函数的封装,代码如下:

function timeoutPromise(promise, timeout) {
  return new Promise((resolve, reject) => {
    const timeoutId = setTimeout(() => {
      reject(new Error('请求超时'));
    }, timeout);

    promise.then((value) => {
      clearTimeout(timeoutId);
      resolve(value);
    }, (reason) => {
      clearTimeout(timeoutId);
      reject(reason);
    });
  });
}

该函数的第一个参数是待包装的 Promise 实例,第二个参数是超时时间。在该函数内部,我们创建了一个新的 Promise 实例,使用定时器在规定时间内强制 reject。

使用示例

我们可以对一个请求函数进行封装,使用带有超时控制的 Promise 包装后的请求函数代码如下:

function requestWithTimeout(url) {
  const promise = fetch(url); // fetch 函数返回一个 Promise
  return timeoutPromise(promise, 5000); // 设置超时时间为 5 秒钟
}

以上代码中,我们使用了 fetch 函数来进行数据请求,并将其返回的 Promise 实例传入 timeoutPromise 函数中包装。

总结

在处理异步任务的时候,我们经常需要在任务执行过程中进行超时控制,避免由于任务一直运行而导致造成问题。本文介绍了如何在 Promise 中加入超时控制的方法,并提供了示例代码。