Я получаю доступ к конечной точке API, которая немного немного. Примерно в 70% случаев он отправляет правильный ответ JSON, но несколько раз он будет дергать и отправлять XML, который говорит "значения/значения". Я хочу сделать цикл while, пока он не вернет правильный ответ. В моем случае я гарантированно вернусь к правильному ответу в конце концов, поэтому именно поэтому я зацикливаюсь, а не выясняю, почему конечная точка выкапывает.
Вот мой код:
var gotValidResponse = false;
while(!gotValidResponse){
request(options, function(err, res, body){
if(err){
console.log(err);
return;
}
try{
data = JSON.parse(body);
console.log(data);
gotValidResponse = true;
}catch(e){
console.log('trying again');
}
});
}
processJSON(data);
Очевидно, что код выше не работает, но, надеюсь, он показывает то, что я пытаюсь сделать. Спасибо за любую помощь!
EDIT: Как это?
var myData = getStuff(options);
function getStuff(options){
request(options, function (err, res, body) {
if (err) {
console.log(err);
return
}
try {
data = JSON.parse(body);
return data;
} catch (e) {
return getStuff(options);
}
})
}
Вы почти поняли это в своем правлении. Что вам нужно сделать, так это продолжать вызов функции, пока она не вернет то, что вы хотите. Подобно этому (мои условности являются просто иллюстративными):
var attemps = 1;
var fake = function(data, cb) {
console.log('Attemp nº', attemps);
if(attemps < 5) {
attemps += 1;
return fake(data, cb);
} else {
return cb(null, 'completed');
}
}
fake('whatever', function(err, res) {
console.log(res)
})
https://jsfiddle.net/eysu2amp/
Если вы проверите консоль, вы увидите, что поддельная функция вызывается 5 раз, а затем возвращает данные. Рекурсивное вызов функции продолжает передавать одну и ту же функцию обратного вызова.
while
цикл будет посылать много запросов , прежде чем один на самом деле возвращается (сrequest
является асинхронным и всеми) - то , что вы должны сделать , это метод , который делает запрос, то в ответ сделать чек, если это не то , что вы хотите вызовите метод еще раз. Таким образом, каждый запрос завершается до запуска другого. В вашем примере, если сервер выйдет из строя, он просто запросит бесконечно.