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 只是解析它。