NodeJs - Выполнение запроса 'GET' в цикле while с модулем запроса

1

Я получаю доступ к конечной точке 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);
        }
    })
}
  • 2
    Ну, определенно не делай этого никогда. Это в while цикл будет посылать много запросов , прежде чем один на самом деле возвращается (с request является асинхронным и всеми) - то , что вы должны сделать , это метод , который делает запрос, то в ответ сделать чек, если это не то , что вы хотите вызовите метод еще раз. Таким образом, каждый запрос завершается до запуска другого. В вашем примере, если сервер выйдет из строя, он просто запросит бесконечно.
  • 0
    Благодарю за ваш ответ. Можете ли вы взглянуть на мою редакцию и сказать мне, если вы это имеете в виду?
Показать ещё 2 комментария
Теги:
request

1 ответ

1
Лучший ответ

Вы почти поняли это в своем правлении. Что вам нужно сделать, так это продолжать вызов функции, пока она не вернет то, что вы хотите. Подобно этому (мои условности являются просто иллюстративными):

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 раз, а затем возвращает данные. Рекурсивное вызов функции продолжает передавать одну и ту же функцию обратного вызова.

  • 1
    Что я искал Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню