BenderLib
@BenderLib
JS

Как правильно работать с асинхронным кодом?

Есть код, который через цикл добавляет данные в массив.

const dns = require('dns');

var arr = [];

function resolve(hostname, rrtype) {
    for (var i = 0; i < rrtype.length; i++) {
        dns.resolve(hostname, rrtype[i], (err, data) => { 
            if (!err) {
                arr.push(data)
                console.log(i)
            } else {
                console.log(err);
            };
        });
    };
}

resolve('google.com', ['A', 'MX', 'NS', 'TXT']);
console.log(arr);


Если вызываем console.log(arr);, то выводится пустой массив потому что функция еще не закончила выполнение. Какой самый правильный способ вывести содержимое массива, только после выполнения функции. Какие вообще способы есть? Потому что всегда мне приходится писать грабли, чтобы этого добиться, хотелось бы уточнить у Вас, как бы Вы в этой ситуации поступили и какие способы правильные и более эффективны? Буду благодарен за любые ответы. Спасибо.
  • Вопрос задан
  • 306 просмотров
Решения вопроса 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Promise
const dns = require('dns');

function resolve(hostname, rrtype) {
    return Promise.all(rrtype.map(rrt => resolveInternal(hostname, rrt)));
}

function resolveInternal(hostname, rrtype) {
    return new Promise((resolve, reject) => {
        dns.resolve(hostname, rrtype, (err, data) => { 
            if (err) {
                reject(err);
                return;
            }
            resolve(data);
        });
    });
}

resolve('google.com', ['A', 'MX', 'NS', 'TXT']).then(arr => console.log(arr));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы