当前位置: 首页 > 知识库问答 >
问题:

没有节点。js是否允许在没有任何等待/预期实现的情况下运行promise?

劳华灿
2023-03-14

我喜欢浏览不和谐标签,尽可能解决问题。我在Python方面相当流利,但在Javascript方面还过得去,但有时我确实会大吃一惊。iscord.py库有许多必须等待的功能。
Discord.js库为不同的事情返回许多promise,当我写涉及这些问题的答案时,我很自然地添加等待。我还查阅了一个教程,查看在Discord.js.中编写async/wait的最佳实践。此外,添加wait需要我使我的事件处理程序异步,这不合理地强化了我的信念,即这些wait语句需要存在。

client.on('message', async message => {
   await message.member.edit({mute: true})
});

这一切都很好,我愚蠢地开始建议其他人也这么做。然而,在阅读问题和写答案的过程中,我偶然发现了一些让我困惑的事情。

client.on('message', message => {
        let memberArray = [message.member];
        memberArray.forEach(member => member.edit({mute: true}));
        console.log("Do something after promised mute");
});

这段代码没有异步函数,也没有等待的promise,仍然在运行。这对我来说似乎很奇怪(如果代码可以在没有它的情况下按同步顺序执行,那么等待代码执行又有什么意义呢?)。

继续混乱,我可以使这个函数异步,并且仍然运行它,而不等待promise。唯一会导致错误的是同步函数中的wait语句。

另一种可能性是,这是不安全的,并且会在生产中造成问题,但是由于我的测试机器人每次只与一个用户(我)进行交互,所以我看不到问题。没有节点。js让我在没有警告的情况下运行坏代码?我是否过度考虑/过度设计了一个非问题?航空食品怎么办?

共有1个答案

史骏
2023-03-14

Javascript中没有要求等待promise。如果您想要进行一个异步调用,该调用返回一个promise并在完成时忽略,那么您可以很好地完成。这有时被称为“火与忘”。我经常在关闭文件时这样做,例如,当文件最终关闭时,我没有什么有用的事情要做。

有一个要求是捕捉可能发生的promise的任何拒绝。因此,如果您的promise有可能被拒绝,您至少需要使用。catch()或在等待周围尝试/catch

在这个特定的例子中:

client.on('message', async message => {
   await message.member.edit({mute: true})
});

在那里不需要使用wait,事实上,它一点用也没有。它不会停止或暂停任何事情。如果message.member.edit({mute: true})返回一个promise,那么wait将暂停该回调的执行,并立即返回一个promise回触发事件的事件系统,但nodejs中的其他事件将继续得到处理,这是函数中的最后一行,所以实际上没有用wait完成任何事情。

如果消息。成员edit({mute:true})返回一个promise,如果您希望在回调中执行其他操作之前等待所有这些操作完成,则必须使用for循环串行处理它们,或者并行处理它们并使用promise跟踪它们。all()

// process serially with for loop and await  
client.on('message', async message => {
    try {
        let memberArray = [message.member];
        for (let member of memberArray) {
            await member.edit({mute: true});
        }
        console.log("Do something after promised mute is completed");
     } catch(e) {
        // catch any rejections
        console.log(e);
     }
});

// process in parallel with Promise.all()
client.on('message', async message => {
    try {
        let memberArray = [message.member];
        await Promise.all(memberArray.map(member => member.edit({mute: true})));
        console.log("Do something after promised mute is completed");
     } catch(e) {
        // catch any rejections
        console.log(e);
     }
});

现在,如果成员。edit({mute:true})不是异步的,并且返回一个链接到异步操作的promise,那么所有这些都是没有意义的,因为在任何情况下都不需要wait

 类似资料:
  • Java/Selenium WebDriver/Firefox 页面上有一个文本“输入”字段。然后它下面有一个‘提交’按钮。加载页面时,输入字段和提交按钮都已启用。在输入字段中输入文本后,是否有一种方法让WebDriver在点击Submit按钮之前等待“x”秒,而不是立即点击它。

  • 文档说这个库运行在GPU上。如果我功能强大的笔记本电脑没有GPU,我还能运行Deeplearning4J吗?

  • 问题内容: 背景: 我正在尝试使用弹性堆栈 (Elastic,Logstash和Kibana) ,但是我没有钱可支付。我不介意使用封闭源代码的部件,只要它们是免费的即可。在这方面,我试图了解弹性许可的工作原理。 我们打开X-Pack似乎建议在Elastic 6.3之后包含X-Pack代码 (尽管具有不同的许可证) 。我也了解X-Pack的某些部分是免费的,而其他部分则不是免费的。这有点令人困惑。

  • 我的遗嘱执行人服务是这样的: 实现了runnable,它的run方法具有巨大的功能,需要调用其他几个API。现在,当我在调试模式下运行代码时,任务就完成了。当我正常运行时,任务是不完整的,线程被终止。线程不是要等到所有任务都完成了吗?为什么他们没有完成任务就被解雇了?

  • 我正在使用Cucumber for BDD、JUnit和Selenium构建一个自动化框架,我们在云中有一个testrail实例用于测试管理,我实现了testrail API以从那里获取所有测试用例,问题是我无法运行这些步骤获取测试用例,因为总是验证第一个功能文件是否存在。 我尝试过结果总是一样的: 在[classpath:features] 0场景0步骤0m0.019s中找不到功能 这是启动该过

  • 我知道,如果我创建了一个角色,并给它分配了AmazonS3FullAccess权限,那么任何EC2实例都会认为这个角色能够以完全权限使用S3。 同样,如果我创建一个角色 选择将使用此角色的服务:EC2 附加权限策略:AmazonEC2FullAccess,策略ARN ARN:aws:iam::aws:Policy/AmazoneC2 FullAccess 然后我将这个角色分配给EC2实例A,我的问