📅  最后修改于: 2023-12-03 15:39:26.992000             🧑  作者: Mango
在编写异步任务的时候,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 中加入超时控制的方法,并提供了示例代码。