如何使用中止控制器设置超时并在 ES7 异步等待功能中重试
How to set timeout with abort controller and retry in ES7 async await function
我正在尝试获取请求,如果请求花费的时间比指定的超时时间长,那么我将使用中止控制器中止它,或者如果响应出现错误(如套接字挂起),则尝试以递归方式再次获取它。我想重复它,即 5 次,最后如果失败则 return 只是错误。但是在我的代码中,第一次尝试后它立即失败并显示获取请求已中止。
这是我的代码。
提前谢谢你。
const getData = async () => {
let url = `https://www.example.com`
let options = {
method: 'POST',
agent: proxyagent,
signal: signal,
body: JSON.stringify({
username: 'abc'
})
}
const fetchData = async (retries) => {
try {
let timer = setTimeout(() => controller.abort(), 1000)
let response = await fetch(url, options)
clearTimeout(timer)
if (response.ok) return response.json()
} catch (e) {
console.log(e)
if (retries === 1 || retries < 1) {
return {
message: 'Something went wrong'
}
}
return await fetchData(retries - 1)
}
}
return await fetchData(5)
}
您不能重复使用中止的信号。您必须为每个 fetch
创建一个新的
const getData = async () => {
let url = `https://www.example.com`;
let controller;
let options = {
method: 'POST',
agent: proxyagent,
body: JSON.stringify({
username: 'abc'
})
}
const fetchData = async (retries) => {
controller = new AbortController();
const optionsWithSignal = {
...options,
signal: controller.signal
};
try {
let timer = setTimeout(() => controller.abort(), 1000)
let response = await fetch(url, optionsWithSignal)
clearTimeout(timer);
if (response.ok) return response.json()
} catch (e) {
console.log(e)
if (retries === 1 || retries < 1) {
return {
message: 'Something went wrong'
}
}
return await fetchData(retries - 1)
}
}
return await fetchData(5)
}
我正在尝试获取请求,如果请求花费的时间比指定的超时时间长,那么我将使用中止控制器中止它,或者如果响应出现错误(如套接字挂起),则尝试以递归方式再次获取它。我想重复它,即 5 次,最后如果失败则 return 只是错误。但是在我的代码中,第一次尝试后它立即失败并显示获取请求已中止。 这是我的代码。 提前谢谢你。
const getData = async () => {
let url = `https://www.example.com`
let options = {
method: 'POST',
agent: proxyagent,
signal: signal,
body: JSON.stringify({
username: 'abc'
})
}
const fetchData = async (retries) => {
try {
let timer = setTimeout(() => controller.abort(), 1000)
let response = await fetch(url, options)
clearTimeout(timer)
if (response.ok) return response.json()
} catch (e) {
console.log(e)
if (retries === 1 || retries < 1) {
return {
message: 'Something went wrong'
}
}
return await fetchData(retries - 1)
}
}
return await fetchData(5)
}
您不能重复使用中止的信号。您必须为每个 fetch
const getData = async () => {
let url = `https://www.example.com`;
let controller;
let options = {
method: 'POST',
agent: proxyagent,
body: JSON.stringify({
username: 'abc'
})
}
const fetchData = async (retries) => {
controller = new AbortController();
const optionsWithSignal = {
...options,
signal: controller.signal
};
try {
let timer = setTimeout(() => controller.abort(), 1000)
let response = await fetch(url, optionsWithSignal)
clearTimeout(timer);
if (response.ok) return response.json()
} catch (e) {
console.log(e)
if (retries === 1 || retries < 1) {
return {
message: 'Something went wrong'
}
}
return await fetchData(retries - 1)
}
}
return await fetchData(5)
}