JS/NodeJS Проблема с циклом внутри асинхронной функции

У меня проблема с этим фрагментом кода:

async getDomains (req, res) {
    try {
        let domains = await Domain.findAll({ raw: true })

        for(domain of domains) {
            console.info('1')
            var options = {
                host: domain.name,
                port: 443,
                method: 'GET'
            };

            var request = https.request(options, (res) => {
                console.info('2')
                console.info('iam here')
                domain.ssl = {
                    'valid_until': res.connection.getPeerCertificate().valid_from
                }
            });

            console.info('3')
            request.end();
        }

        console.info('4')

        res.send(domains)
    } catch(err) {
        res.status(400).send({
            error: err
        })
    }
},

На выходе должно быть 1, 2, 3, 4, но вместо этого я получил 1, 3, 4, 2.

Кто-нибудь знает, как этого добиться?

это связано с тем, что к тому времени, когда https.request обработает запрос, синтаксический анализатор уже выполнил журналы 3 и 4.

rags2riches-prog 09.12.2020 19:10

Вы должны деформировать запрос с обещанием и ждать его. См.: stackoverflow.com/questions/52951091/…

Or Assayag 09.12.2020 19:11

Отвечает ли это на ваш вопрос? как использовать асинхронный ожидание с почтовым запросом https

eol 09.12.2020 19:15

Если вы не можете await https.request(), используйте такую ​​библиотеку, как node-fetch, чтобы вы могли await fetch(). Спасет вас от головной боли

Jeremy Thille 09.12.2020 19:20

@Assayag Я сделал это, но он застрял внутри запроса, и все после этого не будет выполнено.

Delaey 09.12.2020 19:53

@JeremyThille Спасибо за совет, я попробую! но сначала я хочу узнать, как это сделать без использования библиотеки.

Delaey 09.12.2020 19:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
6
127
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы предоставили обратный вызов request, поэтому он отправит запрос и продолжит работу, регистрируя 2 только после получения ответа. Вы можете использовать что-то вроде Promise или async/await, чтобы дождаться ответа на ваш запрос.

var request = await (new Promise((resolve, reject) => {
  https.request(options, (res) => {
    console.info('2');
    console.info('i am here');
    domain.ssl = { /* stuff */ };
    resolve();
  });
));

это правильно, но нет необходимости заключать new Promise в круглые скобки, так как вы ничего не привязываете к созданному объекту Promise.

r3wt 09.12.2020 19:18

Большое спасибо! Теперь у меня есть другая проблема: похоже, что он не выходит из запроса и не печатает, например, «3» или «4», у вас есть идея, как это сделать? Я думаю, что он застрял внутри запроса.

Delaey 09.12.2020 19:43

и через несколько минут я получил «Ошибка: зависание сокета»

Delaey 09.12.2020 20:17

@Delaey, вы могли бы добавить обратные вызовы ошибок для reqjavascript req.on('error', (err) => { console.info(err); });

ginga_ninja217 09.12.2020 21:09

@ ginga_ninja217 Я решил это, заменив «запрос» на «получить», и это сработало как шарм, большое спасибо за помощь!

Delaey 10.12.2020 15:29

Другие вопросы по теме