Node.js 7.5上的``等待意外标识符''


72

我正在尝试使用awaitNode.js中的关键字。我有这个测试脚本:

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

但是当我在节点上运行它时

await x();
      ^
SyntaxError: Unexpected identifier

是否在Mac上使用Node.js 7.5或Node.js 8(每晚构建)使用nodenode --harmony-async-await在Node.js'repl'中运行它。

奇怪的是,相同的代码在Runkit JavaScript笔记本环境中也有效:https ://runkit.com/glynnbird/58a2eb23aad2bb0014ea614b

我究竟做错了什么?


26
await只能在async functions内部使用。
Bergi

2
我不确定是否可以awaitasync函数外部使用,但是我可能错了。
nainy

Answers:


108

多亏了其他评论者和一些其他研究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副本不允许您执行

await x();

就像RunKit笔记本环境一样。


6
声明x为毫无意义async。只需具有正常的功能,并return像您最初所做的那样保证它,它就会更短,更有效并且效果完全相同。
Bergi

在haskell中,他们将其称为异步monad
Clite Tailor

是的,回调很棘手。异步/等待也有些棘手。您需要等待所有内容或什么都不做(之类的)。因此,您必须显式键入async并在本质上异步的每个函数调用上等待。
AturSams

如果将在下面使用那么使用异步的要点是什么?我会理解下面是否可以使用await down。
Teoman shipahi

34

正如其他人所说,您不能在异步函数之外调用“ 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)
    }
})();

这应该在Node 7.5或更高版本中工作。也适用于铬金丝雀片段。


17

因此,正如其他人所建议的,await将在异步内部工作。因此,您可以使用以下代码来避免使用then:

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

callX();

谢谢,也忘记了异步。错误应该是“意外令牌等待”,因为这是无法使用的等待...
linkdd
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.