JavaScript:SyntaxError:await只能在异步函数中使用。

8

我正在使用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

我做错了什么?

4
then((app) => { 这个匿名函数没有标记为 async - skyboyer
2
最好在then回调函数中直接返回Promise并将其移至链的下方,而不是等待它... - Clint
我觉得你尝试解决 Promise 的方式有点奇怪,为什么不使用 .then() 呢? - Talg123
4个回答

18

2
谢谢你的回答!虽然你是第一个回答的,但由于@estus回答的清晰度和深度,我将其标记为正确答案! - user1107173
1
太棒了,你让我的一天都变得美好 :D :D :D - Y-B Cause

5

addEventasync..await和原始Promise的混合使用。 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;
}

通常,不应将普通的回调函数与Promises混合使用。 `callback`参数表示使用`addEvent`的API可能需要进行Promise处理。

3

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

1
您只能在异步函数中使用 await。此外,您只能等待返回 Promise 的代码片段。
在此处,您正在使用不同的上下文中的 await。最好在此处使用 then() 来解决问题。
仅当包含它的立即函数为 async 时,await 才起作用。

4
这个回答如何解答问题?你基本上只是重申了错误信息的内容。 - Clint

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接