nodejs array.push(...). array empty

Почему получаю в результате пустой список?

Промежуточные выводы дают заполненные объекты, но такое чувство, что где то создается временный объект (массив) в который и пушится значение, а переданный в параметрах не заполняется.

Код:

var needle = require('needle');
var cheerio = require('cheerio');

function scrap(src_arr, res_arr){
    for(word of src_arr){
        var url = "https://wooordhunt.ru/word/" + word;
        console.debug(url)

        needle.get(url, function(err, res){
            if (err) throw err;

            var $ = cheerio.load(res.body);
            res_arr.push({
                word: $("#wd_title>h1").text().toLowerCase(),
                transcription_us: $("#us_tr_sound>span").text(),
                transcription_uk: $("#uk_tr_sound>span").text(),
                translation: $(".t_inline_en").text(),
            });
        });
    }
}

var src_words = ["about", "add", "afternon", "again"]
var result = [];
scrap(src_words, result)
console.log(result.length);

Результат:

https://wooordhunt.ru/word/about
https://wooordhunt.ru/word/add
https://wooordhunt.ru/word/afternon
https://wooordhunt.ru/word/again
0

Ответы (1 шт):

Автор решения: Sir Lancevrot
var needle = require('needle');
var cheerio = require('cheerio');
function a_get(url, res_arr){
    return new Promise(function(resolve, reject){
            needle.get(url, function(err, res){
            if (err) throw err;

            var $ = cheerio.load(res.body);
            resolve(res_arr.push({
                word: $("#wd_title>h1").text().toLowerCase(),
                transcription_us: $("#us_tr_sound>span").text(),
                transcription_uk: $("#uk_tr_sound>span").text(),
                translation: $(".t_inline_en").text(),
            }));
        });
    });
}

async function scrap(src_arr, res_arr){
    for(word of src_arr){
        var url = "https://wooordhunt.ru/word/" + word;
        console.debug(url)
        await a_get(url, res_arr);

    }
}

var src_words = ["about", "add", "afternon", "again"]
var result = [];
scrap(src_words, result).then(res => console.log(result.length));

Все дело в асинхронности. ТЫ выводишь длину массива до того, как выполнится get запрос. Промисы и async/await(по сути то же,что и промис, просто синтаксический сахар) помогли решить твою проблему

→ Ссылка