web-dev-qa-db-fra.com

Javascript: SyntaxError: wait n'est valide qu'en fonction asynchrone

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?

3
user1107173

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.

2
estus

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) => {
4
Ankush Sharma

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

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.

0
Tibin Thomas