等待不等待前一个代码块被执行

Posted

技术标签:

【中文标题】等待不等待前一个代码块被执行【英文标题】:Await not waiting for previous code block to be executed 【发布时间】:2020-12-12 02:13:21 【问题描述】:

我正在尝试使用节点 js 制作一个不和谐的机器人,我正在尝试获取用户名作为响应,并且想在用户输入他/她的用户名后发送感谢信。但是这两条消息,询问用户名的文本和感谢您同时发送,请帮助。

module.exports = 
    name: 'create',
    description: "help page",
    async pls(bot,message,args)
       
      if(!args[2])
          message.channel.send('Server nickname was not passed');
          return;
      
      var details = nickname:'',username:'',pass:'',ip:'';
      details.nickname = args[2];

      message.channel.send('Please check your private messages');
  
      await message.author.send('Enter your username (PLS enter in 30 seconds)') 
        .then((newmsg) =>  
          newmsg.channel.awaitMessages(response => response.content, 
          max: 1,
          time: 15000,
          errors: ['time'],
          )
          .then((collected) => 
            details.username = collected.first().content;
            console.log(details);
        
          )
          .catch(() => 
            newmsg.channel.send('time ran out');
          );
        )
      ;

      await message.channel.send('thanks');
      
        
         
        
        
        

    

【问题讨论】:

你不使用await .then():要么try/await/catch the promise,要么使用.then.catch,但不要同时使用.现在你在等待 then() 的结果,这没什么 或许return newmsg.channel.awaitMessages ..... 【参考方案1】:

首先,您不应该在同一行中使用awaitthen。两者都是用于返回 Promise 的函数的符号,并且都告诉代码等待该 Promise 返回。然后,如果您希望无论发生哪种情况都出现“谢谢”,您应该使用finally,它仅在出现 try 或 catch 块后运行。

也就是说,它应该是这样的:

await message.author.send('Enter your username (PLS enter in 30 seconds)');
messages.channel.awaitMessages(response => response.content, 
    max: 1,
    time: 15000,
    errors: ['time'],
).then((collected) => 
    details.username = collected.first().content;
    console.log(details);
).catch(() => 
     message.channel.send('time ran out');
).finally(() =>
     await message.channel.send('thanks');
);

【讨论】:

以上是关于等待不等待前一个代码块被执行的主要内容,如果未能解决你的问题,请参考以下文章

synchronized与Lock比较

线程高级篇-Lock锁和Condition条件

多线程 共享资源 同步锁 java

Java并发006使用层面:Lock锁机制全解析

Java并发编程:Lock

Java学习笔记—多线程(java.util.concurrent.locks包,转载)