SyntaxError:“await”仅在“async”函数中有效 - 需要帮助

Posted

技术标签:

【中文标题】SyntaxError:“await”仅在“async”函数中有效 - 需要帮助【英文标题】:SyntaxError: "await" is only valid in an "async" function - Help Needed 【发布时间】:2020-02-11 15:31:39 【问题描述】:

所以,我正在构建一个 Bot(专门用于 Discord),而且我对 javascript 和一般编码非常陌生。

我正在观看有关从区域命令中清除消息的教程(您告诉机器人要删除多少条消息,它会这样做。)

一切都很顺利,我在这个命令上工作了将近一个小时,在我保存并在我的 CMD 中运行“机器人”后,我收到了这个错误(显示在错误部分和预期结果区域)

基本上:

const fetched = await message.channel.fetchMessages(limit: args[0]);

SyntaxError: await 仅在异步函数中有效

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

仅供参考,在第 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 = await message.channel.fetchMessages(limit: args[0]); // 这需要参数编号。

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

【问题讨论】:

它说await 仅在async 函数内有效。它并不是说它是 FOR async 函数。您在 async 函数之外调用 await async function purge() if 语句中声明的意义何在,它从未被调用过 【参考方案1】:

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

async function func() 
    await ~

像这样修改你的代码

【讨论】:

只是语法错误。检查你的语法【参考方案2】:

您必须将您的方法标记为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()))()
  ]);

【讨论】:

【参考方案3】:

为了使用await,您的最后一次提取需要包装在异步函数中。或者您需要使用then 来解决promise。

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 */
)

【讨论】:

以上是关于SyntaxError:“await”仅在“async”函数中有效 - 需要帮助的主要内容,如果未能解决你的问题,请参考以下文章

你如何摆脱“SyntaxError:'await'外部函数”

SyntaxError: await is only valid in async function

理解ES7中的async/await

es6之 async await 使用小计

SyntaxError:“等待”外部函数,即使它在异步内部

等待总是抛出 SyntaxError:等待仅在 sequelize 的异步函数中有效 [重复]