Ваша проблема в том, что request
является асинхронным, поэтому вы увидите журналы консоли при выполнении обратных вызовов.
Однако вы разрешаете обещание в первой итерации цикла for
.Поэтому вы возвращаете пустой массив.
Вам потребуется разрешить обещание только после того, как последний запрос будет выполнен:
let getData = (links) => {
return new Promise((resolve, reject) => {
let count = 0
for (let nurl of links) {
request(nurl, function(error, response, html) {
let $ = cheerio.load(html);
titles.push($("h1 > a").eq(0).text())
count++ // increment count
if (count === links.length) {
resolve(titles); // resolve if last request to complete
}
});
}
});
};
В качестве альтернативы, вы можете попробовать заключить каждый запрос в обещание, а затемиспользуя Promise.all()
, который разрешается с массивом результатов, когда все обещания выполнены:
let getData = (links) => {
const promises = links
.map(nurl => new Promise((resolve, reject) => {
request(nurl, function(error, response, html) {
let $ = cheerio.load(html);
resolve($("h1 > a").eq(0).text())
})
}))
return Promise.all(promises)
}