在使用await函数时,有时候我们需要设置超时时间,以避免长时间的等待导致程序的阻塞。以下是一种在await函数中添加超时的常见方法:
function timeout(ms) {
return new Promise((resolve, reject) => {
setTimeout(() => {
reject(new Error("Timeout"));
}, ms);
});
}
async function asyncFunc() {
try {
await Promise.race([actualFunction(), timeout(5000)]);
} catch (error) {
// 处理超时异常
console.error(error);
}
}
在上述代码中,timeout函数返回一个Promise,它在指定的时间(ms)后拒绝(reject)并抛出一个Timeout错误。在asyncFunc函数中,使用Promise.race将实际的await函数和超时Promise进行竞争,如果超时Promise先完成,将会抛出Timeout错误。
const controller = new AbortController();
const timeout = setTimeout(() => {
controller.abort();
}, 5000);
try {
const response = await fetch(url, { signal: controller.signal });
clearTimeout(timeout);
// 处理正常返回数据
const data = await response.json();
// ...
} catch (error) {
if (error.name === "AbortError") {
// 处理超时异常
console.error("Timeout");
} else {
// 处理其他异常
console.error(error);
}
}
上述代码中,创建了一个AbortController和一个超时定时器timeout。在fetch API的参数中,使用signal属性将AbortController的signal传递给请求,当超时定时器触发时,调用AbortController的abort方法中止请求。如果请求超时,会抛出AbortError异常,可以在catch块中进行处理。
以上是在await函数中添加超时的两种常见方法。具体使用哪种方法取决于你的应用场景和开发环境。对于Node.js环境,可以使用第一种方法;对于浏览器环境,可以使用第二种方法。
领取专属 10元无门槛券
手把手带您无忧上云