"Ожидать неожиданный идентификатор" на Node.js 7.5
Я экспериментирую с ключевым словом await
в Node.js. У меня этот тест script:
"use strict";
function x() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve({a:42});
},100);
});
}
await x();
Но когда я запускаю его в node, я получаю
await x();
^
SyntaxError: Unexpected identifier
выполняю ли я его с помощью node
или node --harmony-async-await
или в Node.js 'repl' на моем Mac с Node.js 7.5 или Node.js 8 (ночная сборка).
Как ни странно, тот же код работает в среде ноутбука Runkit JavaScript: https://runkit.com/glynnbird/58a2eb23aad2bb0014ea614b
Что я делаю неправильно?
Ответы
Ответ 1
Благодаря другим комментаторам и некоторым другим исследованиям await
может использоваться только в функции async
, например.
async function x() {
var obj = await new Promise(function(resolve, reject) {
setTimeout(function() {
resolve({a:42});
},100);
});
return obj;
}
Затем я мог бы использовать эту функцию как Promise, например.
x().then(console.log)
или в другой асинхронной функции.
Смутно, Node.js repl не позволяет вам делать
await x();
как это делает среда рабочего стола RunKit.
Ответ 2
Как говорили другие, вы не можете вызвать "ждать" вне функции async.
Однако, чтобы обойти это, вы можете обернуть ожидание x(); в вызове асинхронной функции. I.e.,
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)
}
})();
Это должно работать в Node 7.5 или выше. Также работает в области хром канарейки.
Ответ 3
так как другие пользователи ждут, будут работать внутри async. Таким образом, вы можете использовать приведенный ниже код, чтобы избежать использования:
async function callX() {
let x_value = await x();
console.log(x_value);
}
callX();