当前位置: 首页 > 知识库问答 >
问题:

JavaScript:同步错误:wait仅在异步函数中有效

莘光华
2023-03-14

我在Sequelize的节点8上。js

当尝试使用wait时,出现以下错误。

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

代码:

async function addEvent(req, callback) {
    var db = req.app.get('db');
    var event = req.body.event

    db.App.findOne({
        where: {
            owner_id: req.user_id,
        }
    }).then((app) => {

                let promise = new Promise((resolve, reject) => {
                    setTimeout(() => resolve("done!"), 6000)

                })

               // I get an error at this point 
               let result = await promise;

               // let result = await promise;
               //              ^^^^^
               // SyntaxError: await is only valid in async function
            }
    })
}

获取以下错误:

               let result = await promise;
                            ^^^^^
               SyntaxError: await is only valid in async function

我做错了什么?

共有3个答案

平元明
2023-03-14

async/await仅当immediate函数具有async关键字时才起作用,您需要:

...
    }).then(async app => {   // <<<< here

                let promise = new Promise((resolve, reject) => {
                    setTimeout(() => resolve("done!"), 6000)

                })

               // I get an error at this point 
               let result = await promise;

               // let result = await promise;
               //              ^^^^^
               // SyntaxError: await is only valid in async function
            }
    })
徐鸿文
2023-03-14

add事件是异步... wait和原始promise的混合物。wait然后的语法糖。不是一个就是另一个。混合会导致不正确的控制流;db。一个pp.findOne(...)。然后(...)promise没有被链接或返回,因此不能从外部获得add事件

它应该是:

async function addEvent(req, callback) {
    var db = req.app.get('db');
    var event = req.body.event

    const app = await db.App.findOne({
        where: {
            owner_id: req.user_id,
        }
    });

    let promise = new Promise((resolve, reject) => {
        setTimeout(() => resolve("done!"), 6000)
    })

    let result = await promise;
}

一般来说,简单的回调不应该与promise混在一起callback参数表示可能还需要推荐使用addEvent的API。

糜雪峰
2023-03-14

只能在异步函数下运行WAIT语句。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

所以,你可以写你的

}).then((app) => {

}).then(async (app) => {
 类似资料:
  • 我正在尝试设置一些数据在使用这个节点js代码的FIRESTAR: 在控制台中运行文件: 给我这个错误: 如何解决这个问题

  • 我编写了一段代码,使用promise从异步调用返回一些数据。当我尝试执行时,我得到“语法错误等待仅在异步函数中有效”,并且我无法得到代理应用程序请求。。。错误:连接错误。 我不确定为什么会出现这些错误 在函数调用之前,我尝试过使用异步,但没有成功 我希望变量体具有从httpGet函数返回的数据。现在我得到了上面提到的错误。但是不使用wait,我得到body的值为{}。 请帮帮忙

  • 在开始之前,我承认有几个问题可能听起来与我的标题类似,但是,我读到的所有问题都比我的代码更复杂,解释似乎与我的情况无关。 有人能帮我理解我的代码(下面的代码片段)中发生了什么导致了这个错误吗 未捕获SyntaxError:await仅在异步函数和顶级模块体中有效。 据我所见,导致错误的位于“顶层”主体中。或者是顶级身体的其他意思?谢谢! 编辑区别于其他建议(类似)的问题在这里:我的问题不涉及htt

  • 问题内容: 首先,这是一个非常特殊的情况,它以错误的方式故意将异步调用改型为一个非常同步的代码库,该代码库长成千上万行,并且当前时间不具备进行更改的能力。对的。” 它伤害了我的每一个生命,但是现实和理想往往并没有相互融合。我知道这很糟糕。 好的,顺便说一句,我该如何做,这样我可以: 示例(或缺少示例)全部使用库和/或编译器,这两种库均不适用于此解决方案。我需要一个如何使其冻结的具体示例(例如,在调

  • 我有一个异步函数,它在代码中的某个地方按setInterval运行。此函数定期更新一些缓存。 我还有一个不同的同步函数,它需要检索值——最好是从缓存中检索,但如果是缓存未命中,则从数据源检索(我意识到以同步方式进行IO操作是不明智的,但假设在这种情况下需要这样做)。 我的问题是,我希望同步函数能够等待异步函数中的值,但是不可能在非异步函数中使用关键字: 现在,通过将中的逻辑提取到一个新的同步函数中

  • 我在中写了这段代码 然后我尝试在另一个文件中使用它 我得到一个错误 “等待仅在异步函数中有效” 问题是什么?