web-dev-qa-db-fra.com

wait est uniquement valide en fonction asynchrone

J'ai écrit ce code dans lib/helper.js

var myfunction = async function(x,y) {
   ....

   reutrn [variableA, variableB]
}

exports.myfunction = myfunction;

et puis j'ai essayé de l'utiliser dans un autre fichier 

 var helper = require('./helper.js');

 var start = function(a,b){
     ....

     const result = await helper.myfunction('test','test');
 }

 exports.start = start;

J'ai une erreur 

"wait n'est valide qu'en fonction asynchrone"

Quelle est la solution?

26
j.doe

L'erreur ne fait pas référence à myfunction mais à start.

async function start() {
   ....

   const result = await helper.myfunction('test', 'test');
}

MODIFIER

// My function
const myfunction = async function(x, y) {
  return [
    x,
    y,
  ];
}

// Start function
const start = async function(a, b) {
  const result = await myfunction('test', 'test');
  
  console.log(result);
}

// Call start
start();

39
Grégory NEUT

Lorsque j'ai eu cette erreur, il est apparu que j'avais reçu un appel à la fonction de carte dans ma fonction "asynchrone". Ce message d'erreur faisait donc référence au fait que la fonction de carte n'était pas marquée comme "asynchrone". J'ai résolu ce problème en supprimant l'appel "wait" de la fonction map et en trouvant un autre moyen d'obtenir le comportement attendu.

var myfunction = async function(x,y) {
    ....
    someArray.map(someVariable => { // <- This was the function giving the error
        return await someFunction(someVariable);
    });
}
3
John Langford

Le vrai problème est que vous devez comprendre comment async/wait fonctionne ici . L’erreur est dans votre start function() 

Vous devez définir la fonction en tant que fonction Async pour utiliser await en tant que

await utilise des méthodes/fonctions promesses/futures/renvoyant des tâches et 

async marque une méthode/fonction comme étant capable d’attendre. 

Await effectue en fait le même processus de promesse/résolution et comme la fonction est async, une autre tâche est traitée de manière parallèle

Pour plus d’informations, vous pouvez consulter MDN DOCS

async function foo(){

let myAsyncCall = await .... ('/endpoint') // hitting on some api
console.log(myAsyncCall) // myAsyncCall will log out whenever the request get resolved

}

foo()
1
Satyam Pathak

L'implémentation actuelle de async/await ne prend en charge que le mot clé await à l'intérieur des fonctions async. Modifiez votre signature de fonction start pour pouvoir utiliser await à l'intérieur de start

 var start = async function(a, b) {

 }

Pour les personnes intéressées, la proposition de await de niveau supérieur est actuellement à l'étape 2: https://github.com/tc39/proposal-top-level-await

0
user835611