Javascript 如何正确执行createReactionCollection
我一直想在用户按下复选框或X的反应时创建一个事件。不过,当我使用该函数时,我得到一个错误,即消息对象不存在该事件 我已经回到了这一点,但它没有起作用 编辑: 我对messageSent对象执行了Javascript 如何正确执行createReactionCollection,javascript,node.js,express,discord.js,Javascript,Node.js,Express,Discord.js,我一直想在用户按下复选框或X的反应时创建一个事件。不过,当我使用该函数时,我得到一个错误,即消息对象不存在该事件 我已经回到了这一点,但它没有起作用 编辑: 我对messageSent对象执行了console.log,得到了这个Promise{} var messageSent=user.send({embed}) .then(功能(消息){ message.react('✅') message.react('❎') }); messageSent.createReactionCollectio
console.log
,得到了这个Promise{}
var messageSent=user.send({embed})
.then(功能(消息){
message.react('✅')
message.react('❎')
});
messageSent.createReactionCollection(r=>['✅','❎'].包括(r.emoji.name))
.on('collect',r=>{
if(r.emoji.name=='✅') {
用户。发送(“已验证!✅")
}else if(r.emoji.name=='❎') {
用户。发送(“已取消!❎")
}
});
}
同步与异步
假设你正计划去接你的朋友去看一场体育比赛。你不确定他们希望你什么时候来,所以你打电话问他们。他们想了一会儿,然后告诉你一次。你得到了你要求的信息,所以你挂断了。在编程术语中,这是一个同步代码的例子(有时在Node.js中被认为是“普通”代码)
让自己回到同样的情况。但是,当你这次给朋友打电话时,他们很忙。你不想打扰他们,所以你让他们稍后给你打电话。你挂断电话,但现在你在等待。一个小时后,他们给你回电话告诉你时间。这是异步代码的思考过程
屏幕后面还有很多内容,但为了简单起见,我不会用这些信息轰炸你
承诺
Promise
对象表示异步操作的最终完成(或失败)及其结果值
让我们将代码分解,以便更好地理解问题
返回承诺User.send()
还返回一个PromisePromise.then()
var messageSent=Promise-->Promise
承诺
处于以下状态之一:
- 未决:初始状态,既不满足也不拒绝
- 已完成:表示操作已成功完成
- 拒绝:表示操作失败
console.log
,得到了这个Promise{}
虽然您将变量定义为承诺,但它尚未立即完成,因此尚未返回任何值。它处于挂起状态
解决 那么,我们如何找回承诺的结果呢?我们必须等待它
-
<> LI> < P>保持一个简单的流程,可以使用<代码>等待< /Cord>关键字。它在继续执行其他代码之前等待承诺被兑现或拒绝。请考虑以下示例:
//使用'await'所需的异步上下文(在异步函数中的意思)
var messageSent=等待用户发送(嵌入);
等待消息发送。反应('✅');
等待消息发送。反应('❎');
//创建反应收集器。
< L> > P>可选的,您可以坚持<代码>()>代码>链。在履行承诺时,回调将被调用返回的值。在某些上下文中,这是简单的。但是,回调会很快变得混乱,并且返回值的范围将受到限制。
user.send(嵌入)
。然后(messageSent=>{
messageSent.react('✅')
.然后(()=>messageSent.react('❎'))
.然后(()=>{
//创建反应收集器。
});
});
//请记住,这里的代码将在“user.send(embed)”之后立即执行
我可能已经修复了它,因为某些原因它没有返回消息的对象,所以我将
messageSent=message;
添加到了。然后
这在您的情况下是有效的,因为then()
回调中的值将是已实现的承诺,并且您将变量设置为返回值。不过,这不是最好的主意
- 您可以使用
语句代替附加多个try…catch
方法。如果catch()
块中的任何承诺被拒绝,则执行try
块中的代码。例如:catch
试试看{ const user=wait bot.fetchUser('someID'); 等待用户发送(嵌入); }捕捉(错误){ 控制台错误(err); }
user.send(嵌入)
。然后(messageSent=>{…})
.catch(控制台错误);
资源
messageSent.createReactionCollector
而不是messageSent.createReactionCollection
I get“messageSent.createReactionCollector不是函数“我可能已经修复了它,因为某些原因它没有返回消息的对象,所以我将messageSent=message;
添加到了。然后
TypeError: messageSent.createReactionCollection is not a function
at app.post (C:\Users\teddy\Desktop\Verify\app.js:46:25)
at Layer.handle [as handle_request] (C:\Users\teddy\Desktop\Verify\node_modules\express\lib\router\layer.js:95:5)
at next (C:\Users\teddy\Desktop\Verify\node_modules\express\lib\router\route.js:137:13)
at Route.dispatch (C:\Users\teddy\Desktop\Verify\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request] (C:\Users\teddy\Desktop\Verify\node_modules\express\lib\router\layer.js:95:5)
at C:\Users\teddy\Desktop\Verify\node_modules\express\lib\router\index.js:281:22
at Function.process_params (C:\Users\teddy\Desktop\Verify\node_modules\express\lib\router\index.js:335:12)
at next (C:\Users\teddy\Desktop\Verify\node_modules\express\lib\router\index.js:275:10)
at expressInit (C:\Users\teddy\Desktop\Verify\node_modules\express\lib\middleware\init.js:40:5)
at Layer.handle [as handle_request] (C:\Users\teddy\Desktop\Verify\node_modules\express\lib\router\layer.js:95:5)