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(по сути то же,что и промис, просто синтаксический сахар) помогли решить твою проблему