ожидают неожиданные идентификатор на узел.js 7.5


я экспериментирую с await ключевое слово в узел.js. У меня есть этот тестовый скрипт:

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

но когда я запускаю его в узле я получаю

await x();
      ^
SyntaxError: Unexpected identifier

запускаю ли я его с node или node --harmony-async-await или в узле.js 'repl'на моем Mac с узлом.js 7.5 или узел.js 8 (ночная сборка).

как ни странно, тот же код работает в среде runkit JavaScript notebook:https://runkit.com/glynnbird/58a2eb23aad2bb0014ea614b

что я делаю не так?

3 55

3 ответа:

спасибо другим комментаторам и некоторым другим исследованиям await может использоваться только в async функцию, например,

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

затем я мог бы использовать эту функцию в качестве обещания, например

x().then(console.log)

или в другой асинхронной функции.

путано, узел.JS repl не позволяет вам делать

await x();

где, как это делает среда runkit notebook.

как говорили другие, вы не можете вызвать 'await' вне асинхронной функции. Однако, чтобы обойти это, вы можете обернуть await x(); в вызове асинхронной функции. Т. е.,

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)
    }
})();

Это должно работать в узле 7.5 или выше. Также работает в области фрагментов chrome canary.

Так что, как предлагают другие ждут будет работать внутри асинхронного. Таким образом, вы можете использовать приведенный ниже код, чтобы избежать использования тогда:

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

callX();