web-dev-qa-db-ja.com

Node.js 7.5の「予期しない識別子を待つ」

Node.jsのawaitキーワードを試しています。私はこのテストスクリプトを持っています:

"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で実行するか、Mac上のNode.js 7.5またはNode.js 8(ナイトリービルド)でNode.jsの 'repl'で実行するかにかかわらず。

奇妙なことに、同じコードがRunkit JavaScriptノートブック環境でも動作します。 https://runkit.com/glynnbird/58a2eb23aad2bb0014ea614b

何がおかしいのですか?

70
Glynn Bird

他のコメンターや他の研究のおかげで、awaitasync関数でのみ使用できます。

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

私はそれから約束としてこの機能を使用することができます。

x().then(console.log)

または別の非同期機能で。

混乱を招くように、Node.jsの回答ではできません

await x();

runKitノートブック環境と同じように。

99
Glynn Bird

他の人が言っているように、非同期関数の外で '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以降で動作するはずです。クロムカナリアスニペット領域でも動作します。

34
Cody G

そう他の人によって示唆されるように非同期が内部で動作するのを待ちます。したがって、thenを使用しないようにするには、以下のコードを使用します。

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

callX();
16
user3013823