node.js - Node.js 异步和同步集成
问题描述
简而言之,我正在使用 discord.js 制作一个 Discord 机器人,但我在使用异步和同步功能时遇到了问题。为了分配变量,函数的最后一部分循环遍历每个变量,然后将其转换为所需的类型,可以在这里看到:
argsList.forEach((argument, index) => {
let finalArgument = argument
const type = args[index].type
if (type === UserArgument) {
new UserArgument(argument).result
.then(userObject => {
finalArgument = userObject
})
.catch(error => {
throw error
})
} else if (type === MemberArgument) {
new MemberArgument(argument, guild).result
.then(memberObject => {
finalArgument = memberObject
})
.catch(error => {
throw error
})
} else if (type === ChannelArgument) {
new ChannelArgument(argument, guild).result
.then(channelObject => {
finalArgument = channelObject
})
.catch(error => {
throw error
})
} else if (type === RoleArgument) {
new RoleArgument(argument, guild).result
.then(roleObject => {
finalArgument = roleObject
})
.catch(error => {
throw error
})
}
finalArgList.push(finalArgument)
})
return finalArgList
}
这是 UserArgument 类的外观示例(所有其他参数基本看起来都一样)
class UserArgument {
constructor(user) {
this.result = new Promise((resolve, reject) => {
if (typeof(user) === "string") {
if (user.match(/^<@!([0-9]+)>$/)) {
user = user.match(/[0-9]+/)
}
if (isNumeric(user)) {
ArgumentBase.client.users.fetch(user)
.then(userObject => {
resolve(userObject)
return userObject
})
}
this.#getUserFromName(user)
.then(userObject => {
resolve(userObject)
return userObject
})
} else if (user instanceof DiscordJS.User) {
resolve(user)
return user
} else if (user instanceof DiscordJS.GuildMember || user instanceof DiscordJS.ThreadMember) {
resolve(user.user)
return user.user
}
let userObject = ArgumentBase.client.users.resolve(user)
if (userObject) {
resolve(userObject)
return userObject
}
reject(new UserNotFound(toString(user)))
})
}
async #getUserFromName(username) {
return new Promise((resolve, reject) => {
for (const user in ArgumentBase.client.users.cache) {
if (user.username === username) {
resolve(user)
return user
}
}
throw new UserNotFound(username)
})
}
}
我遇到的问题是处理每个参数的代码不会等待函数完成而是跳过它。这当然会导致在处理参数之前执行命令。对于我的测试,我正在测试从 UserArgument 类中抛出错误,并且确实抛出了错误,但只是在命令已经执行之后,因为那是它决定完成的时候。
我的假设是,由于 Promise 是一个异步函数,因此代码会一直运行并且不会等待它。我尝试将参数函数转换为异步函数并使用等待,但我一直得到SyntaxError: await is only valid in async functions and the top level bodies of modules
,即使该函数是异步函数(函数声明为static async getCommandArgs(invokedString, args, guild = undefined)
)。如果有人可以帮助我,那就太棒了。感谢您的时间和帮助。
解决方案
推荐阅读
- r - 防止将类属性设置为元素
- android - 在styles.xml 中为*all* 主题样式添加一个子项以避免重复代码
- python - 传输样本数组的最佳方式
- c# - 如何创建 ASP .NET MVC 5 解决方案?
- amazon-web-services - AWS 复合警报 - 自动扩展操作
- mysql - MySql如何在顶部显示特定行,然后在其下方显示剩余行
- python - 如何将 PyQt5 QTableView 的verticalHeader 移动到右侧?
- objective-c - How to find method, linked to NSButton?
- c - How to send Sysrq programmatically over serial and is CONFIG_MAGIC_SYSRQ_SERIAL required
- java - Unlikely argument type for equals(): String seems to be unrelated to MemberSearchRequest