web-dev-qa-db-fra.com

'wait Inattent Identifiant' sur Node.js 7.5

J'expérimente avec le mot clé await 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 dans le noeud je reçois

await x();
      ^
SyntaxError: Unexpected identifier

que je l'exécute avec node ou node --harmony-async-await ou dans le fichier 'repl' de Node.js sur mon Mac avec Node.js 7.5 ou Node.js 8 (version nocturne).

Bizarrement, le même code fonctionne dans l'environnement de bloc-notes JavaScript Runkit: https://runkit.com/glynnbird/58a2eb23aad2bb0014ea614b

Qu'est-ce que je fais mal?

70
Glynn Bird

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

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 asynchrone.

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

await x();

où l’environnement de portable RunKit.

101
Glynn Bird

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 Node 7.5 ou supérieur. Fonctionne également dans la zone chrome extraits de canaries.

34
Cody G

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();
16
user3013823