繁体   English   中英

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

[英]Javascript: SyntaxError: await is only valid in async function

我在Sequelize.js的 Node 8上

尝试使用await时发出以下错误。

SyntaxError: await is only valid in async function

码:

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

我究竟做错了什么?

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

所以,你可以写你的

}).then((app) => {

}).then(async (app) => {

async/await仅在立即函数具有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
            }
    })

addEventasync..await和raw promises的混合体。 awaitthen语法糖。 这是一个或另一个。 混合物导致不正确的控制流量; db.App.findOne(...).then(...) promise未链接或返回,因此无法从外部addEvent

它应该是:

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;
}

通常,普通回调不应与承诺混在一起。 callback参数表示使用addEvent API也可能需要被保护。

您只能在异步函数内使用await。 您还可以等待一段返回promise的代码。

在这里,您在不同的上下文中使用await。 你最好用then()来解决这个问题。

await只有在包含它的立即函数是异步的情况下才有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM