私は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
何が悪いのですか?
addEvent
は、_async..await
_とrawプロミスを組み合わせたものです。 await
はthen
の構文糖です。それはどちらかです。混合すると、制御フローが不正確になります。 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も保証する必要があることを示します。
Awaitステートメントは、非同期関数でのみ実行できます。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
だから、あなたはあなたを書くことができます
}).then((app) => {
なので
}).then(async (app) => {
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
}
})
Awaitは、非同期の関数内でのみ使用できます。また、promiseを返すコードのみを待つこともできます。
ここでは、異なるコンテキスト内でawaitを使用しています。ここでthen()を使用して問題を解決することをお勧めします。
awaitは、それを囲む即時関数が非同期の場合にのみ機能します。