javascript - 创建角色,然后将角色赋予成员不起作用,有没有更好的方法来处理这个问题?不和谐.js
问题描述
我想根据消息创建一个角色,然后一旦创建了该角色,我想将其提供给同一消息中提到的那些。角色创建得非常好,但没有给用户正确的角色。
我试过按名字命名,但这会导致找不到角色,所以我试图根据角色所处的位置来获取角色,但是当我需要给出角色时,它不会t 似乎处于正确的位置
var nameOC = getClanName(message.content);
console.log(nameOC);
message.guild.createRole({
name: nameOC,
hoist: true,
mentionable: false,
position: 1,
});
var role = message.guild.roles.find(role => role.position === 1);
console.log(role);
list.members.forEach(member => {
if(message.content.includes(member)){
member.addRoles(role);
}
});
message.channel.send(nameOC);
使用正确的名称可以完美地制作角色,但是它给出的角色是以前的第一个角色,而不是刚刚制作的角色。
解决方案
同步与异步
假设您计划接您的朋友去参加体育赛事。你不确定他们希望你什么时候来,所以你给他们打电话问他们。他们想了一会儿,然后告诉你一个时间。你得到了你要求的信息,所以你挂断了。在编程术语中,这将是同步代码的一个示例(有时被认为是 Node.js 中的“正常”代码)。
让自己回到同样的境地。然而,当你这次打电话给你的朋友时,他们很忙。你不想打扰他们,所以你让他们稍后给你打电话。你挂断了,但现在你等着。一个小时后,他们给你回电话,告诉你时间。这就是异步代码的思考过程。
屏幕后面还有很多内容,但为简单起见,我不会用所有这些信息轰炸你。
承诺
该
Promise
对象表示异步操作的最终完成(或失败)及其结果值。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
该Guild.createRole()
方法返回一个 Promise。
A
Promise
处于以下状态之一:
- 待定:初始状态,既不满足也不拒绝。
- 已完成:表示操作成功完成。
- denied:表示操作失败。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
尽管您调用了该方法来创建角色,但它并不是立即创建的。Promise 处于待处理状态。
解决方案
那么,我们如何检索 Promise 的结果呢?我们必须等待它。
保持简单的流程,您可以使用
await
关键字。它所做的只是等待 Promise 被履行或拒绝,然后再继续执行进一步的代码。考虑以下示例:// Asynchronous context (meaning within an async function) needed to use 'await.' var role = await message.guild.createRole(...); console.log(role); // Continue using the 'role' variable...
或者,您可以使用
then()
链。回调将在 Promise 实现时使用返回的值调用。在某些情况下,这很简单。但是,回调很快就会变得混乱,并且返回值的范围会受到限制。考虑这个例子:message.guild.createRole(...) .then(role => { console.log(role); // Continue using the 'role' variable... });
错误处理
当一个 Promise 被拒绝时,这意味着出现了问题。必须捕获源自被拒绝的 Promise 的错误。如果不是,您将在控制台中收到带有错误的警告。
您可以附加
catch()
与 类似的方法then()
,除了将错误作为其回调参数返回并且仅在被拒绝时调用。考虑这个精简的例子:message.guild.createRole(...) .then(role => {...}) .catch(console.error);
catch()
您可以使用try...catch
语句,而不是附加多个方法。如果try
块内的任何 Promise 被拒绝,catch
则执行块内的代码。例如:try { var role = await message.guild.createRole(...); await role.delete(); // Maybe not a logical example... } catch(err) { console.error(err); }
资源
推荐阅读
- firebase - Firebase 动态查询取决于数组中的数据
- python-3.x - 蟒蛇中的 Python 3.2
- angular - Angular 2/4/5 路由导航仅重新加载相同的路由 URL 一次
- php - 跟踪 Wordpress 插件 cpu/内存负载 - 有可能吗?
- javascript - 在猫鼬模式中使用 ref 填充集合失败
- java - 在很多活动中使用蓝牙的应用程序
- android - 使用 minifyenabled 时的警告:true
- angular - 生产中的角度 i18n 翻译不起作用
- c# - Directshow 捕获(h264 编码)和预览
- ruby - 如何处理带有分页的表格行