Node.js 如何使用中止控制器设置超时,并在ES7异步等待函数中重试
我正在尝试获取请求,如果请求花费的时间超过指定的超时时间,那么我将使用abort controller中止请求,或者如果响应中出现错误(如套接字挂起),则再次尝试递归获取请求。我想重复它,即5次,最后如果失败,然后返回错误。但在我的代码中,在第一次尝试后,它立即失败,并显示提取请求已中止。 这是我的密码。 先谢谢你Node.js 如何使用中止控制器设置超时,并在ES7异步等待函数中重试,node.js,recursion,async-await,fetch,settimeout,Node.js,Recursion,Async Await,Fetch,Settimeout,我正在尝试获取请求,如果请求花费的时间超过指定的超时时间,那么我将使用abort controller中止请求,或者如果响应中出现错误(如套接字挂起),则再次尝试递归获取请求。我想重复它,即5次,最后如果失败,然后返回错误。但在我的代码中,在第一次尝试后,它立即失败,并显示提取请求已中止。 这是我的密码。 先谢谢你 const getData = async () => { let url = `https://www.example.com` let options = {
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)
}
const getData=async()=>{
让url=`https://www.example.com`
让选项={
方法:“POST”,
代理:代理,
信号:信号,,
正文:JSON.stringify({
用户名:“abc”
})
}
const fetchData=async(重试)=>{
试一试{
let timer=setTimeout(()=>controller.abort(),1000)
let response=等待获取(url、选项)
清除超时(计时器)
if(response.ok)返回response.json()
}捕获(e){
控制台日志(e)
如果(重试次数===1 | |重试次数<1){
返回{
信息:“出了点问题”
}
}
返回等待获取数据(重试次数-1)
}
}
返回等待获取数据(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)
}
const getData=async()=>{
让url=`https://www.example.com`;
let控制器;
让选项={
方法:“POST”,
代理:代理,
正文:JSON.stringify({
用户名:“abc”
})
}
const fetchData=async(重试)=>{
控制器=新的中止控制器();
常量选项带信号={
…选项,
信号:控制器。信号
};
试一试{
let timer=setTimeout(()=>controller.abort(),1000)
let response=wait fetch(url,选项带信号)
清除超时(计时器);
if(response.ok)返回response.json()
}捕获(e){
控制台日志(e)
如果(重试次数===1 | |重试次数<1){
返回{
信息:“出了点问题”
}
}
返回等待获取数据(重试次数-1)
}
}
返回等待获取数据(5)
}