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

时间:2018-10-24 17:46:58

标签: javascript node.js async-await sequelize.js es6-promise

我在Sequelize.js的节点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 个答案:

答案 0 :(得分:5)

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

所以,你可以写你的

var viewModel = new StoryDetailsViewModelAnonymousUser
{
    StoryId = FoundStory.Id,
    AuthorId = FoundStory.AuthorId,
    Story = FoundStory,
    Comments = _dbContext.Comments.Where(x => x.StoryId == FoundStory.Id).ToList()
};

if (signedInUserId != null)
{
    viewModel.User = _dbContext.Users.SingleOrDefault(x => x.Id == signedInUserId);
}

return View(viewModel);

}).then((app) => {

答案 1 :(得分:2)

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

答案 2 :(得分:2)

addEventasync..await和原始承诺的混合。 awaitthen的语法糖。是一个或另一个。混合会导致错误的控制流; db.App.findOne(...).then(...)的诺言未链接或返回,因此无法从外部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;
}

通常,普通回调不应与promise混合使用。 callback参数表示使用addEvent的API可能也需要被告知。

答案 3 :(得分:0)

您只能在异步函数内使用await。您也只能等待一段返回承诺的代码。

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

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