286 votes

wait est uniquement valide en fonction asynchrone

J'ai écrit ce code en 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?

350voto

Grégory NEUT Points 8839

L'erreur n'est pas fait référence à l' myfunction mais start.

async function start() {
   ....

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

// 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();


Je saisis l'occasion de cette question pour vous conseiller sur un anti-modèle à l'aide de await qui est : return await.


MAL

async function myfunction() {
  console.log('Inside of myfunction');
}

// Here we wait for the myfunction to finish
// and then returns a promise that'll be waited for aswell
// It's useless to wait the myfunction to finish before to return
// we can simply returns a promise that will be resolved later
async function start() {
  // useless await here
  return await myfunction();
}

// Call start
(async() => {
  console.log('before start');

  await start();
  
  console.log('after start');
})();

CORRECT

async function myfunction() {
  console.log('Inside of myfunction');
}

// Here we wait for the myfunction to finish
// and then returns a promise that'll be waited for aswell
// It's useless to wait the myfunction to finish before to return
// we can simply returns a promise that will be resolved later
async function start() {
  return myfunction();
}

// Call start
(async() => {
  console.log('before start');

  await start();
  
  console.log('after start');
})();

29voto

Satyam Pathak Points 696

Le vrai problème est, vous devez comprendre comment async/await fonctionne ici. L'erreur est dans votre start function().

Vous devez définir une fonction comme async fonction await comme await consomme promesse / avenir / tâche-de retour des méthodes / fonctions et async marque une méthode / fonction capable d'utiliser les attendent. await est en train de faire le même processus de la promesse ou de le résoudre et que la fonction est - async autre tâche est en cours de traitement en parallèle.

Pour plus d'info, 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()

17voto

John Langford Points 305

Lorsque j'ai eu cette erreur, il est apparu que j'avais reçu un appel à la fonction de carte à l'intérieur de 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);
    });
}
 

3voto

user835611 Points 41

L'implémentation actuelle de l' async / await prend uniquement en charge l' await mot-clé à l'intérieur de l' async fonctions de Changer votre start signature de fonction de sorte que vous pouvez utiliser await à l'intérieur d' start.

 var start = async function(a, b) {

 }

Pour ceux que cela intéresse, la proposition de haut niveau- await est actuellement à l'Étape 2: https://github.com/tc39/proposal-top-level-await

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X