【发布时间】:2020-07-27 13:56:30
【问题描述】:
下面我有一个 Node.js 函数,它向不同的 url 发出一系列请求,然后对于每个 url,我使用 Cheerio 网络抓取库循环遍历 dom 上的元素并创建一个子数组。在每个请求结束时(在子数组已满之后),我想将该数组的内容推送到一个更大的数组,该数组超出了请求范围。
我尝试的方法似乎不起作用。看起来我无法从 .then 块内访问“allPlayers”。
function readPlayers(teamUrls){
const allPlayers = [];
teamUrls.forEach((teamUrl, i) => {
const options = {
gzip: true,
uri: teamUrl,
Connection: 'keep-alive',
transform: function (body) {
return cheerio.load(body);
}
};
request(options)
.then(($) => {
const team = [];
$('tbody').children('tr').each(function(j, element){
const playerName = $(element).children('td').eq(1).children('span').eq(1).find('a').text().trim();
const player = { 'playerName': playerName };
team.push(player);
});
allPlayers.push(team);
}).catch(err => console.log("error: " + err)) );
});
}
所以我想知道重写此代码以使请求工作并用结果填充外部数组 (allPlayers) 的最佳方法。
我曾考虑尝试将整个请求直接推送到外部数组中,但无济于事。
在这个例子中,我使用 request-promise 来发出请求。
我研究过使用 Promise.map,我认为它适合这种情况。然后我会返回整个请求(我认为),但我不完全理解在这种情况下我在做什么......或者它是否会起作用。
任何人都可以解释这种情况下的范围,为什么我不能像我正在尝试的那样做。
非常感谢
【问题讨论】:
-
我不明白你为什么在
then语句中使用美元符号 -.then(($) => { -
这只是从cheerio web scraper 请求返回的DOM ..(我认为jquery 就是这样做的,这就是文档的方式)。它可以很容易地重命名为“DOM”或其他名称
-
这里是
requestrequest-promise?因为原来的requestlib 没有返回承诺 -
您绝对可以访问闭包内的
allPlayers(在then块内)。您可能只是试图过早地消耗假定的结果。 -
将
forEach替换为map,而不是推送只是返回结果并将Promise.all放在所有内容的前面。
标签: javascript node.js http promise