Подтвердить что ты не робот

"Ожидать неожиданный идентификатор" на 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

Что я делаю неправильно?

4b9b3361

Ответ 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();