user1107173
user1107173

Reputation: 10764

Javascript: SyntaxError: await is only valid in async function

I am on Node 8 with Sequelize.js

Gtting the following error when trying to use await.

SyntaxError: await is only valid in async function

Code:

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

Getting the following error:

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

What am I doing wrong?

Upvotes: 8

Views: 34332

Answers (4)

Estus Flask
Estus Flask

Reputation: 222498

addEvent is a mixture of async..await and raw promises. await is syntactic sugar for then. It's either one or another. A mixture results in incorrect control flow; db.App.findOne(...).then(...) promise is not chained or returned and thus is not available from outside addEvent.

It should be:

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

Generally plain callbacks shouldn't be mixed with promises. callback parameter indicates that API that uses addEvent may need to be promisified as well.

Upvotes: 5

Tibin Thomas
Tibin Thomas

Reputation: 782

You can use await only inside a function which is async. Also you can await only a piece of code that returns a promise.

Here you are using await inside a different context. Better you use then() here to solve the problem.

await only works if the immediate function that encloses it is async.

Upvotes: 1

Ankush Sharma
Ankush Sharma

Reputation: 677

You can run await statement only under async function. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

So, you can write your

}).then((app) => {

as

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

Upvotes: 18

user5047085
user5047085

Reputation:

async/await only works if the immediate function has the async keyword, you need this:

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

Upvotes: 3

Related Questions