71 votes

'wait Inattent Identifier' sur Node.js 7.5

Je suis expérimenter avec l' await mot-clé dans Node.js. J'ai ce script de test:

"use strict";
function x() {
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      resolve({a:42});
    },100);
  });
}
await x();

Mais quand je le lance il en nœud-je obtenir

await x();
      ^
SyntaxError: Unexpected identifier

si je le lance avec node ou node --harmony-async-await ou, dans le Node.js la "repl" sur mon Mac avec Node.js 7.5 ou Node.js 8 (nightly build).

Curieusement, le même code fonctionne dans le Runkit JavaScript cahier de l'environnement: https://runkit.com/glynnbird/58a2eb23aad2bb0014ea614b

Ce que je fais mal?

105voto

Glynn Bird Points 3665

Grâce aux autres commentateurs et à certaines autres recherches, await ne peut être utilisé que dans une fonction async , par exemple

 async function x() {
  var obj = await new Promise(function(resolve, reject) {
    setTimeout(function() {
      resolve({a:42});
    },100);
  });
  return obj;
}
 

Je pourrais ensuite utiliser cette fonction comme une promesse, par exemple

 x().then(console.log)
 

ou dans une autre fonction async.

Confusément, la réplique Node.js ne vous permet pas de faire

 await x();
 

où l’environnement de portable RunKit.

34voto

Cody G. Points 3374

Comme d'autres l'ont déjà dit, vous ne pouvez pas appeler "attendre" en dehors d'une fonction asynchrone. Cependant, pour contourner ce problème, vous pouvez envelopper le wait x (); dans un appel de fonction asynchrone. C'est à dire,

 function x() {
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      resolve({a:42});
    },100);
  });
}
//Shorter Version of x():
var x = () => new Promise((res,rej)=>setTimeout(() => res({a:42}),100));

(async ()=>{
    try{
      var result = await x();
      console.log(result);
    }catch(e){
      console.log(e)
    }
})();
 

Cela devrait fonctionner dans le nœud 7.5 ou supérieur. Fonctionne également dans la zone des extraits de canaris chromés.

16voto

user3013823 Points 161

Ainsi, comme suggéré par d’autres, Wait fonctionnera en mode asynchrone. Vous pouvez donc utiliser le code ci-dessous pour éviter d'utiliser ensuite:

 async function callX() {
    let x_value = await x();
    console.log(x_value);
}

callX();
 

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