Запрос - дождитесь завершения вызова API Node.js

У меня проблема с функциями обратного вызова, и я не могу найти для этого решения. Мне нужно получить одно значение внутри обратного вызова для сравнения в последнее время. Проблема в том, что когда я сравниваю, моя переменная все еще имеет начальное значение.

router.get('/qadashboard', (req, res) => {
    var total = -1;

    var options = {
        method: 'GET',
        uri: 'https://myurl.com/users',
        json: true
    };

    request(options)
    .then((response) => {
        // Get Total
        total = response.body.total;
    })
    .catch((err) => {
        console.log('API Error - ', err);
    });

    if (total < 10) {
        // Code here
    } else {
        // Code here
    }

    res.render("index");
});

Total всегда равно -1, и я уверен, что response.body.total не равно -1 (всегда возвращаются положительные числа). Если я кодирую console.log (response.body.total) внутри функции обратного вызова, она возвращает правильный номер. Могу ли я дождаться завершения выполнения обратного вызова, а затем сравнить, если всего <10?

Спасибо


person Pedro Guerra    schedule 31.03.2020    source источник
comment
почему бы вам не переместить блок if else внутри обратного вызова запроса? он показывает вам значение по умолчанию, потому что для выполнения обещания требуется время, в то время как ваш другой код выполняется раньше.   -  person anees    schedule 31.03.2020
comment
весь код за пределами then после него, т.е. if и res.render срабатывают до того, как запрос будет разрешен, просто поместите все это в then .. then работу по рефакторингу request библиотеки, которая устарела.   -  person Lawrence Cherone    schedule 31.03.2020
comment
Сначала объясните ваш вопрос правильно, затем поставьте -1 на мои ответы   -  person Mark Minerov    schedule 01.04.2020


Ответы (3)


Хорошо, поэтому первым решением было бы переместить блок условия и ответа внутри обещания.

router.get('/qadashboard', (req, res) => {
    var total = -1;

    var options = {
        method: 'GET',
        uri: 'https://myurl.com/users',
        json: true
    };

    request(options)
    .then((response) => {
        // Get Total
        total = response.body.total;
        if (total < 10) {
            // Code here
        } else {
            // Code here
        }

        res.render("index");
    })
    .catch((err) => {
        console.log('API Error - ', err);
        res.render("error"); // maybe render an error view
    });
});

или вы также можете дождаться разрешения обещания, используя async / await

router.get('/qadashboard', async (req, res) => {
    var total = -1;

    var options = {
        method: 'GET',
        uri: 'https://myurl.com/users',
        json: true
    };

    try{
        let resp = await request(options);
        total = resp.body.total;
    }catch(err){
        console.log('API Error - ', err);
    }

    if (total < 10) {
        // Code here
    } else {
        // Code here
    }

    res.render("index");
});
person anees    schedule 31.03.2020
comment
Anees, я не могу переместить условие по другим причинам, но async / await работал правильно. Большое спасибо - person Pedro Guerra; 01.04.2020

Использование await в асинхронных функциях позволяет использовать более императивный стиль программирования, так как он ожидает выполнения обещания (блокировки):

const response = await request(options);   // wait for response
total = response.body.total;
..

Возможно, вы захотите добавить ручную обработку ошибок с помощью try-catch.

person Matt    schedule 31.03.2020
comment
Пожалуйста, не публикуйте только код в качестве ответа, но также объясните, что делает ваш код и как он решает проблему вопроса. Ответы с объяснением обычно более качественные и с большей вероятностью получат положительные отзывы. - person Suraj Kumar; 01.04.2020
comment
Добавьте несколько предложений, чтобы объяснить, что делает ваш код, чтобы вы могли получить больше голосов за свой ответ. - person Fuzzy Analysis; 01.04.2020

Попробуй это:

router.get('/qadashboard', (req, res) => {
    var total = -1;

    var options = {
        method: 'GET',
        uri: 'https://myurl.com/users',
        json: true
    };

    request(options)
    .then((response) => {
        // Get Total
        total = response.body.total;

        if (total < 10) {
            // Code here
        } else {
            // Code here
        }
    })
    .catch((err) => {
        console.log('API Error - ', err);
    });

    res.render("index");
});
person Mark Minerov    schedule 31.03.2020