NodeJS - 运行 加载变量的函数
NodeJS - running function to load in variables
我想知道如何将此函数 (scrapData
) 仅 运行 一次,这样它就不会递增每个项目并一次加载所有项目。这是我的 CMD 中发生的事情的图像。我对 JS 不是很熟悉,所以我不太确定我做错了什么。
下面是该命令的一段代码:
//latest articles command
if (message.content.startsWith(prefix + 'latest')) {
//website url variables
const website_domain = "https://hypebeast.com/";
let website_path = args[0];
let website_url = website_domain + website_path;
//extra arguments variable
let extra_arg = args.slice(1).join(" ");
//if user inputs too many arguments
if (extra_arg.length > 0) {
message.reply('too many arguments! Please refer to `h.help` for correct usage.');
} else {
//opening url and loading in websites html
function scrapData(website_url) {
return rp(website_url)
.then(body => {
var items = [],
$ = cheerio.load(body);
//web scraping here
$('.post-box').each(function() {
var title = $(this).find($('.title h2 span')).first().text(),
caption = $(this).find($('.post-box-excerpt p')).first().text(),
article_url = $(this).find($('.col-hb-post-image a')).first().attr('href'),
thumbnail_long = $(this).find($('.thumbnail img')).first().attr('src');
//adding title, caption, etc to list
items.push({title, caption, article_url, thumbnail_long});
//check items in console
console.log(items);
})
return items;
})
}
//run webscraping function
scrapData(website_url)
.then(items => {
//produce embed messages
for (i = 0; i < items.length; i++) {
message.channel.send({
embed: {
color: config.embed_colour,
title: (i + 1 + ". " + items[i].title),
url: items[i].article_url,
description: items[i].caption,
}
})
}
message.channel.send("`SOURCE: " + website_url + "`");
console.log('DONE!');
})
}
}
实际上,您的函数 是 只有 运行 一次。 scrapData
仅从不在循环或 each
语句中的代码调用一次(我假设代码片段的顶部是命令的开头)。要减少记录的控制台消息数量,请考虑将 console.log
调用移动到 return
语句正上方的行。
作为对您评论的直接回应,当您致电 rp(url)
时,它只从网站请求一次信息。附加的 then
主体包含一个循环,该循环作用于 rp
中的 return,但它已经完成了它的工作(这就是 Promise 保证的:执行此 在 之后,其他事情结束了)。 cheerio
完全脱机工作,并且它使用的任何数据在执行时已经完全下载,它使用的函数名称 (load
) 在您的程序上下文中只是有点误导。 rp
获取正文,cheerio
只是解析它。
我想知道如何将此函数 (scrapData
) 仅 运行 一次,这样它就不会递增每个项目并一次加载所有项目。这是我的 CMD 中发生的事情的图像。我对 JS 不是很熟悉,所以我不太确定我做错了什么。
下面是该命令的一段代码:
//latest articles command
if (message.content.startsWith(prefix + 'latest')) {
//website url variables
const website_domain = "https://hypebeast.com/";
let website_path = args[0];
let website_url = website_domain + website_path;
//extra arguments variable
let extra_arg = args.slice(1).join(" ");
//if user inputs too many arguments
if (extra_arg.length > 0) {
message.reply('too many arguments! Please refer to `h.help` for correct usage.');
} else {
//opening url and loading in websites html
function scrapData(website_url) {
return rp(website_url)
.then(body => {
var items = [],
$ = cheerio.load(body);
//web scraping here
$('.post-box').each(function() {
var title = $(this).find($('.title h2 span')).first().text(),
caption = $(this).find($('.post-box-excerpt p')).first().text(),
article_url = $(this).find($('.col-hb-post-image a')).first().attr('href'),
thumbnail_long = $(this).find($('.thumbnail img')).first().attr('src');
//adding title, caption, etc to list
items.push({title, caption, article_url, thumbnail_long});
//check items in console
console.log(items);
})
return items;
})
}
//run webscraping function
scrapData(website_url)
.then(items => {
//produce embed messages
for (i = 0; i < items.length; i++) {
message.channel.send({
embed: {
color: config.embed_colour,
title: (i + 1 + ". " + items[i].title),
url: items[i].article_url,
description: items[i].caption,
}
})
}
message.channel.send("`SOURCE: " + website_url + "`");
console.log('DONE!');
})
}
}
实际上,您的函数 是 只有 运行 一次。 scrapData
仅从不在循环或 each
语句中的代码调用一次(我假设代码片段的顶部是命令的开头)。要减少记录的控制台消息数量,请考虑将 console.log
调用移动到 return
语句正上方的行。
作为对您评论的直接回应,当您致电 rp(url)
时,它只从网站请求一次信息。附加的 then
主体包含一个循环,该循环作用于 rp
中的 return,但它已经完成了它的工作(这就是 Promise 保证的:执行此 在 之后,其他事情结束了)。 cheerio
完全脱机工作,并且它使用的任何数据在执行时已经完全下载,它使用的函数名称 (load
) 在您的程序上下文中只是有点误导。 rp
获取正文,cheerio
只是解析它。