javascript - 如何在继续代码之前捕获错误?
问题描述
我有一个命令向公会中的每个用户发送消息。当然,用户也有可能关闭了 DM。我想通过使用来计算这些用户(并向频道发送一条消息,其中包含禁用它的用户数量).catch
。
我的问题是,.catch 块在命令的其余部分之后.catch
执行(它向通道发送消息的部分)在块中,我将1添加到变量中,每次它给我错误。在频道消息中,我发送变量。显然,变量将为0,因为它在运行.catch
块之前发送消息。
在阻止之后,如何发送带有已关闭用户数量的消息.catch
?
这是我的代码:
var text = args.join(' ')
message.guild.members.forEach(member => {
member.send(text).catch(() => {
console.log("Can't send DM to this user!")
faultyusers++
});
});
console.log(faultyusers);
message.channel.send("Successfully sent message to all members in the server. (Warning: **" + faultyusers + "** users might have not received the message because of their settings.)")
(当我运行它时, faultyusers始终为0。)
解决方案
每个member.send()
都是异步的。因此,为此您需要为每个调用创建一个Promise 。member.send()
之后,您运行所有的 Promise,当它们全部解决时,您会得到一系列结果,您可以从中计算未收到消息的用户数量
// this function returns promise that will
// resolve with { success: true } or { success: false }
// depending on whether or not the user received the message (member.send() failed)
const sendMessageAndGetResult = (text, member) =>
member
.send(text)
.then(() => ({ success: true }))
.catch(() => ({ success: false }))
const sendMessages = async (text) => {
// create one such promise for each user in guild
const promises = message.guild.members.map(member => sendMessageAndGetResult(text, member))
// wait until all promises are resolved
// allResults will be an looking like this [{ success: true }, { success: false }, ...]
const allResults = await Promise.all(promises)
// count users that did not receive message
const faultyUsersCount = allResults.filter(result => !result.success).length
console.log(faultyUsersCount)
message.channel.send("Successfully sent message to all members in the server. (Warning: **" + faultyUsersCount + "** users might have not received the message because of their settings.)")
}
// usage
sendMessages('hello')
推荐阅读
- .net - 无法在 SQL Server Management Studio 中加载文件或程序集 'System.EnterpriseServices,版本 = 4.0.0.0
- jenkins - 如何让 Jenkins lastBuild API 与多分支管道一起工作?
- xamarin - 如何从 xamarin 形式的类中连接字符串?
- reactjs - 打字稿:使用接受组件实例的外部函数反应渲染
- java - 实体管理器在 Java 程序中意外为空
- javascript - D3 v4 中的方形网格出口选择
- python - 如何根据图像名称上的数字顺序从文件夹加载图像
- excel - 如何在同一列中对多种货币求和
- c - 是否有 cl 或 gcc 选项将“字符串”视为 const wchar_t 指针而不是 const char 指针?
- android - 如何在android应用程序中同时连接多个BLE设备