Javascript DiscordJS-异步响应消息

Javascript DiscordJS-异步响应消息,javascript,node.js,asynchronous,discord.js,Javascript,Node.js,Asynchronous,Discord.js,我正在编写的discord bot中的一个命令涉及使用JSDom抓取一个网站,在读取HTML之前等待其脚本全部运行。我发现,有时该站点的脚本需要很长时间才能运行,这会导致bot在等待最后一个查询完成时3分钟内没有响应。我如何才能将抓取操作转换为异步函数,以便bot在等待第一次调用完成时仍能响应其他消息 这是我当前代码的简化版本: client.on('message',message=>{ //命令1-web刮板 console.log(“基准A”); jsdom.jsdom.fromURL(链

我正在编写的discord bot中的一个命令涉及使用JSDom抓取一个网站,在读取HTML之前等待其脚本全部运行。我发现,有时该站点的脚本需要很长时间才能运行,这会导致bot在等待最后一个查询完成时3分钟内没有响应。我如何才能将抓取操作转换为异步函数,以便bot在等待第一次调用完成时仍能响应其他消息

这是我当前代码的简化版本:

client.on('message',message=>{
//命令1-web刮板
console.log(“基准A”);
jsdom.jsdom.fromURL(链接,{resources:“usable”,runScripts:“dangerously”}){
控制台日志(“基准B”);
dom.window.document.addEventListener('DOMContentLoaded',()=>{
console.log(“基准C”);
setImmediate(()=>{
console.log(“基准测试D”);
//阅读DOM并用它做一些事情
message.channel.send(来自dom的一些值);
});
});
});
//命令2
//命令3
//命令4
//等等。
});

你可以看到我包括了一些日志语句。当有人调用
command1
时,控制台中发生的情况是基准测试A、B、C几乎立即显示,但基准测试D最多需要3分钟才能显示。我面临的主要问题是,在基准C和基准D之间的这段时间里,没有人可以查询我的机器人。因此,我想以某种方式将代码中的webscraping部分移动到它自己的异步函数中,这样它就可以在后台运行,而不会占用主块,从而让其他人在处理这个耗时的命令时继续使用bot。但我不知道如何在NodeJS中实现这一点,因为JavaScript不支持多线程。

再深入一点,我已经解决了自己的问题。我将webscraping函数放在一个工作线程中,每次我想让它运行时,我都会将链接从主线程发布到工作线程,让它完成自己的工作,然后在完成后将消息发布回主线程

下面是代码以前的样子:

//bot.js
client.on('message',message=>{
jsdom.jsdom.fromURL(链接,{resources:“usable”,runScripts:“dangerously”}){
dom.window.document.addEventListener('DOMContentLoaded',()=>{
setImmediate(()=>{
//阅读DOM并用它做一些事情
message.channel.send(来自dom的一些值);
});
});
});
});
下面是它之后的样子:

//bot.js
const-worker=new-worker('./worker.js');
client.on('message',message=>{
//构造链接
worker.once('message',response=>{
message.channel.send(响应);
});
worker.postMessage(链接);
});
//worker.js
parentPort.on('message',link=>{
jsdom.jsdom.fromURL(链接,{resources:“usable”,runScripts:“dangerously”}){
dom.window.document.addEventListener('DOMContentLoaded',()=>{
setImmediate(()=>{
//阅读DOM并用它做一些事情
parentPort.post(来自dom的一些值);
});
});
});
});
现在所有的webscraping都是单独完成的,其他用户也可以同时查询bot的其他命令,而无需等待几分钟完成第一个任务。也许我错过了一个更简单的解决方案,但a)我不会自称是JS专家,b)这正是我想要的方式,因此我认为没有理由再次更改它