2016-02-03 29 views
3

我目前有工作代码,执行请求,并检查它是否收到一个成功的状态代码200.我想在此上成长,并循环它将继续发送请求,直到状态码是200.我尝试使用while循环但没有收到正确的结果。谢谢您的帮助!节点JS:请求循环,直到状态代码200

request('http://0.0.0.0:9200', function (error, response, body) { 
    if (!error && response.statusCode == 200) { 
     console.log('success'); 
     do(something); 
    } 
    else { 
     console.log('fail'); 
    } 
}); 
+0

可以将请求包装在一个函数中,然后让它在失败情况下自行调用? – millerbr

回答

8

会是这样的:

let retry = (function() { 
    let count = 0; 

    return function(max, timeout, next) { 
    request('http://0.0.0.0:9200', function (error, response, body) { 
     if (error || response.statusCode !== 200) { 
     console.log('fail'); 

     if (count++ < max) { 
      return setTimeout(function() { 
      retry(max, timeout, next); 
      }, timeout); 
     } else { 
      return next(new Error('max retries reached')); 
     } 
     } 

     console.log('success'); 
     next(null, body); 
    }); 
    } 
})(); 

retry(20, 1000, function(err, body) { 
    do(something); 
}); 

您可以设置重试的最大数量和重试之间的超时。这样你就不会引入一个无限循环,并且你不会向重载的请求目标传递最后一拳^^

+0

你介意解释这个功能是如何工作的。我已经实现了它,但理解仍然有点模糊。 – emarel

+0

你不明白什么? – migg

1

我想要一个更直观的答案,包括promise。我建立在miggs答案之内尝试/捕捉下面的承诺和axios代码。基于递归函数

const throwNumbers = (count = 0) => { 
    console.log(count); 
    if (count++ < 10) { 
    throwNumbers(count); 
    } else { 
    console.log('max reached'); 
    }; 
}; 

你可以把任何东西上试一试其他的部分,并在捕捉部分处理错误代码一个简单的例子

。你必须设置最大重试次数,在我的情况下是10次。

let getResponse = async(count = 0) => { 
    try { 
    const axiosResponse = await axios.get(someURL, { 
     params: { 
     parameter1: parameter1, 
     }, 
    }); 
    return axiosResponse; 
    } catch (error) { 
    if (error || error.status != 200) { 
     console.error('failed, retry'); 

     if (count++ < 10) { 
     return getResponse(count); 
     } else { 
     throw new Error('max retries reached'); 
     }; 
    } else { 
     throw error; 
    }; 
    }; 
}; 

你会调用该函数具有以下,并与响应值处理机构或什么的。

let response = await getResponse(); 
console.log('This is the response:', response); 

没有超时但为我工作。