web-dev-qa-db-ja.com

JavaScript:SyntaxError:awaitは非同期関数でのみ有効です

私はNode 8 with 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

何が悪いのですか?

5
user1107173

addEventは、_async..await_とrawプロミスを組み合わせたものです。 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;
}
_

一般的に、プレーンコールバックは、promiseと混合しないでください。 callbackパラメータは、addEventを使用するAPIも保証する必要があることを示します。

4
Estus Flask

Awaitステートメントは、非同期関数でのみ実行できます。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

だから、あなたはあなたを書くことができます

}).then((app) => {

なので

}).then(async (app) => {
8
Ankush Sharma

async/awaitは、immediate関数に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
            }
    })
3
user5047085

Awaitは、非同期の関数内でのみ使用できます。また、promiseを返すコードのみを待つこともできます。

ここでは、異なるコンテキスト内でawaitを使用しています。ここでthen()を使用して問題を解決することをお勧めします。

awaitは、それを囲む即時関数が非同期の場合にのみ機能します。

1
Tibin Thomas