Javascript 如何正确执行createReactionCollection

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

我一直想在用户按下复选框或X的反应时创建一个事件。不过,当我使用该函数时,我得到一个错误,即消息对象不存在该事件

我已经回到了这一点,但它没有起作用

编辑: 我对messageSent对象执行了
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()
    返回承诺
  • Promise.then()
    还返回一个Promise
因此,您的代码实际上如下所示:

var messageSent=Promise-->Promise
承诺
处于以下状态之一:

  • 未决:初始状态,既不满足也不拒绝
  • 已完成:表示操作已成功完成
  • 拒绝:表示操作失败

我对messageSent对象执行了
console.log
,得到了这个
Promise{}

虽然您将变量定义为承诺,但它尚未立即完成,因此尚未返回任何值。它处于挂起状态


解决 那么,我们如何找回承诺的结果呢?我们必须等待它

    <> LI> < P>保持一个简单的流程,可以使用<代码>等待< /Cord>关键字。它在继续执行其他代码之前等待承诺被兑现或拒绝。请考虑以下示例:

    //使用'await'所需的异步上下文(在异步函数中的意思)
    var messageSent=等待用户发送(嵌入);
    等待消息发送。反应('✅');
    等待消息发送。反应('❎');
    //创建反应收集器。
    
    < L> > P>可选的,您可以坚持<代码>()>代码>链。在履行承诺时,回调将被调用返回的值。在某些上下文中,这是简单的。但是,回调会很快变得混乱,并且返回值的范围将受到限制。
    user.send(嵌入)
    。然后(messageSent=>{
    messageSent.react('✅')
    .然后(()=>messageSent.react('❎'))
    .然后(()=>{
    //创建反应收集器。
    });
    });
    //请记住,这里的代码将在“user.send(embed)”之后立即执行
    

  • 我可能已经修复了它,因为某些原因它没有返回消息的对象,所以我将
    messageSent=message;
    添加到了。然后

    这在您的情况下是有效的,因为
    then()
    回调中的值将是已实现的承诺,并且您将变量设置为返回值。不过,这不是最好的主意


错误处理 当承诺被拒绝时,意味着出现了问题。必须捕获来自被拒绝承诺的错误。如果没有,您将在控制台中收到带有错误的警告

    >p>可以附加<代码> CcChar()/Case>方法,该方法将类似于<代码>()< /代码>,除了将错误作为回调参数返回,并且仅在拒绝时调用。请考虑这个简短的例子:

    user.send(嵌入)
    。然后(messageSent=>{…})
    .catch(控制台错误);
    
  • 您可以使用
    try…catch
    语句代替附加多个
    catch()
    方法。如果
    try
    块中的任何承诺被拒绝,则执行
    catch
    块中的代码。例如:

    试试看{
    const user=wait bot.fetchUser('someID');
    等待用户发送(嵌入);
    }捕捉(错误){
    控制台错误(err);
    }
    

资源

看起来像是输入错误。请尝试使用
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)