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?
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.
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.
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();