SyntaxError:“等待”仅在“异步”功能中有效-需要帮助

时间:2019-10-15 02:29:02

标签: javascript asynchronous async-await syntax-error discord.js

因此,我正在构建Bot(专门用于Discord),并且对JavaScript和编码领域还很陌生。

我正在观看有关从区域命令清除消息的教程(您告诉机器人要删除多少条消息,并且确实如此。)

一切进展顺利,我在该命令上工作了将近一个小时,然后在我的CMD中保存并运行了“机器人”后,出现了此错误(显示在错误部分和预期结果区域)< / p>

基本上:

  

const fetched =等待message.channel.fetchMessages({limit:args [0]});

     

SyntaxError:等待仅在异步功能中有效

但是我很确定这是一个async函数,我对编码还是很陌生,所以我可能已经关闭它了,或者不确定。

FYI在第31行中,我认为我“打开”了async,但是也许我关闭了它。

我没有发送完整的代码。

由于我对编码非常陌生,所以我做不到很多。我确实添加了“;” (不带引号)解决了一个错误,但不是我要问的错误。

// Purge messages command.
if (msg.startsWith(prefix + 'PURGE')) { // COmmand checks like "!PING", but ``startWith`` because you'll be adding a number.
  // Wrapping in an async because ``awaits`` only work in asyncs.
  async function purge() {
    message.delete(); // Deletes command trigger, to clean up the chat more fully.

    //Now, we want to check if the user has the `Moderator` role.
    if (!message.member.roles.find("name", "Moderator")) { // This checks to see if they DONT have that role (the "!" inverts the true/false)
      message.channel.send('You need the Moderator role to use this command!');
      return; // This returns the code, so the rest doesn't run.
    }
  }
  // Check if the argument is a number.
  if (isNaN(args[0])) {
    // Posts that the message is NaN (not a number)
    message.channel.send('Your argument was not a number. \n Usage:  ' + 
      prefix + 'purge  <amount>'); //\n turns into a new line.
    // Stops the actions, so it doesn't start deleting messages.
    return;
  }

  const fetched = await message.channel.fetchMessages({limit: args[0]}); // This takes the argument number.

预期结果:Bot打开并删除大量指定的消息。

完整的错误消息:

  

C:\ Users \ xxxx \ OneDrive \ Desktop \ Xxxxx xxx \ xxx.js:49        const fetched =等待message.channel.fetchMessages({limit:args [0]}); //这需要参数编号。

     

SyntaxError:等待仅在异步功能中有效       在Module._compile(内部/模块/cjs/loader.js:723:23)       在Object.Module._extensions..js(内部/模块/cjs/loader.js:789:10)       在Module.load(internal / modules / cjs / loader.js:653:32)       在tryModuleLoad(内部/模块/cjs/loader.js:593:12)       在Function.Module._load(内部/模块/cjs/loader.js:585:3)       在Function.Module.runMain(内部/模块/cjs/loader.js:831:12)       在启动时(internal / bootstrap / node.js:283:19)       在bootstrapNodeJSCore(internal / bootstrap / node.js:622:3)

3 个答案:

答案 0 :(得分:0)

您必须将方法标记为async

Mozilla的async function中的示例。

async function asyncCall() {
  console.log('calling');
  var result = await resolveAfter2Seconds();
  console.log(result);
  // expected output: 'resolved'
}
var parallel = async function() {
  console.log('==PARALLEL with await Promise.all==');

  // Start 2 "jobs" in parallel and wait for both of them to complete
  await Promise.all([
      (async()=>console.log(await resolveAfter2Seconds()))(),
      (async()=>console.log(await resolveAfter1Second()))()
  ]);
}

答案 1 :(得分:0)

您的最后一次获取需要包装在异步函数中才能使用await。或者,或者您需要利用then来解决承诺。

const getData = async (arg) => {
    const data = await message.channel.fetchMessages({limit: args})
    return await data.json()
}

在该示例中,您必须解析getData,这意味着您要么必须使用then,要么将其上下文包装在async中,因此请将其包装在异步中功能。

或者:

 message.channel.fetchMessages({limit: args[0]})
    .then(response => response.json())
    .then(data => {
    /* do something here */
})

答案 2 :(得分:0)

我无法完全了解您的代码。但我认为您应该在该函数的顶部添加“异步”。

async function func() {
    await ~
}

以这种样式修改代码