Je suis sur le nœud 8 avec Sequelize.js
Récupérer l'erreur suivante lorsque vous essayez d'utiliser 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
}
})
}
Obtenir l'erreur suivante:
let result = await promise;
^^^^^
SyntaxError: await is only valid in async function
Qu'est-ce que je fais mal?
addEvent
est un mélange de async..await
et de promesses brutes. await
est le sucre syntaxique pour then
. C'est l'un ou l'autre. Un mélange entraîne un flux de contrôle incorrect; db.App.findOne(...).then(...)
promise n'est pas chaîné ni retourné et n'est donc pas disponible de l'extérieur addEvent
.
CA devrait etre:
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;
}
En général, les rappels en clair ne doivent pas être mélangés avec des promesses. Le paramètre callback
indique que l'API qui utilise addEvent
peut également avoir besoin d'être promis.
Vous ne pouvez exécuter une instruction wait que sous la fonction async. . https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
Donc, vous pouvez écrire votre
}).then((app) => {
comme
}).then(async (app) => {
async/await
ne fonctionne que si la fonction immédiate contient le mot clé async, vous avez besoin de ceci:
...
}).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
}
})
Vous pouvez utiliser wait uniquement dans une fonction asynchrone. De plus, vous ne pouvez attendre qu'un morceau de code qui retourne une promesse.
Ici, vous utilisez attendre dans un contexte différent. Mieux vaut utiliser then () ici pour résoudre le problème.
wait ne fonctionne que si la fonction immédiate qui l'englobe est asynchrone.