Javascript: SyntaxError: await действителен только в асинхронной функции - PullRequest
0 голосов
/ 24 октября 2018

Я на Узле 8 с Sequelize.js

Получаю следующую ошибку при попытке использовать 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 голосов
/ 24 октября 2018

addEvent - это смесь async..await и необработанных обещаний.await является синтаксическим сахаром для then.Это либо тот, либо другой.Смесь приводит к неправильному контролю потока;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;
}

Обычно простые обратные вызовы не должны смешиваться с обещаниями.Параметр callback указывает на то, что API, который использует addEvent, также может быть обещан.

0 голосов
/ 24 октября 2018

Вы можете запустить оператор await только под асинхронной функцией.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

Итак, вы можете написать свой

}).then((app) => {

как

}).then(async (app) => {
0 голосов
/ 24 октября 2018

Вы можете использовать await только внутри функции, которая является асинхронной.Также вы можете ожидать только часть кода, которая возвращает обещание.

Здесь вы используете await в другом контексте.Лучше использовать функцию then () для решения проблемы.

Ожидание работает только в том случае, если непосредственная функция, которая его заключает, является асинхронной.

0 голосов
/ 24 октября 2018

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