定义异步函数时的异步/等待节点 v9“意外令牌函数”

Posted

技术标签:

【中文标题】定义异步函数时的异步/等待节点 v9“意外令牌函数”【英文标题】:async/await node v9 "unexpected token function" when defining async function 【发布时间】:2018-08-17 06:22:42 【问题描述】:

我想在我的应用程序中使用 async/await,主要用于查询我的数据库

我有这个功能:

async function getVariables() 

    var id = await Service.getIdByName('JollyClick')

    console.log(id)


应该叫这个:

serviceSchema.statics.getIdByName = async function getIdByName (serviceName) 

    this.findOne(name :serviceName ).exec().then(function(service)
        return service._id
    )

但我得到一个错误:

async function getVariables() 
      ^^^^^^^^

SyntaxError: Unexpected token function

我正在使用节点 v9

请帮忙!

【问题讨论】:

错误是在运行脚本时发生的,还是只是在 IDE 中发生? 除了我在 node js 环境中使用的 c9 IDE 之外,我没有在其他任何地方运行它 您是否尝试过在命令行上运行,例如节点 myscript.js 看看你得到了什么? 任何版本的 Node > 7.6 都应该没有 async 关键字的问题,这就是为什么我怀疑这是 C9 设置中的问题。 【参考方案1】:

我认为您不需要 getIdByName 函数上的异步,例如

serviceSchema.statics.getIdByName = function getIdByName (serviceName) 

    this.findOne(name :serviceName ).exec().then(function(service)
        return service._id
    )

会好的。

我不认为这是您的错误的根源。否则你的代码看起来还不错,它在 Node 8.9.4 上为我运行,你的 IDE 会做一些烦人的事情吗?当您没有选择正确的 javascript 版本时,我已经看到 WebStorm 会这样做。

当然,当您使用 await 调用函数时,您通常会使用返回承诺的函数。

所以我也会像这样更改 getIdByName:

serviceSchema.statics.getIdByName = function getIdByName (serviceName) 

    return this.findOne(name :serviceName ).exec().then(function(service)
       return service._id;
    )

这使承诺链保持完整。

语法:

异步函数 getVariables()

在任何情况下都是正确的。

如果您的 IDE 以旧版本的 JavaScript 为目标,它可能不允许您使用 async 关键字。

试试这个小提琴来查看正在使用的 async 关键字:

https://jsfiddle.net/u453mdkb/3/

【讨论】:

我的错误,删除了以前的消息,通过终端运行它!谢谢我是新手,我应该去哪里解决这个问题? return Promise.resolve(service._id); 不是必需的。你可以做return service._id。从 .then() 处理程序返回的值成为承诺链的解析值。 嘿@mtts,我想这是一个C9问题,值得在那里检查设置。目标是什么版本的 JavaScript 等等。如果您不能针对 Node 的最新版本,我会感到非常惊讶。

以上是关于定义异步函数时的异步/等待节点 v9“意外令牌函数”的主要内容,如果未能解决你的问题,请参考以下文章

eslint 解析错误:带有异步的意外令牌函数

节点在继续之前等待异步功能

等待异步函数导致未定义

如何使节点 fs 与类异步/等待?

如何在节点 js 中正确使用等待/异步与 for 循环

使用类/异步等待时获取未定义的“this”[重复]