Node.js 7.5 上的“等待意外标识符”

IT技术 javascript node.js asynchronous
2021-01-29 01:11:06

我正在尝试使用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

我是否符合运行nodenode --harmony-async-await或Node.js的在我的Mac“REPL”用Node.js的7.5或Node.js的8(每日构建)。

奇怪的是,同样的代码在 Runkit JavaScript notebook 环境中有效:https ://runkit.com/glynnbird/58a2eb23aad2bb0014ea614b

我究竟做错了什么?

3个回答

感谢其他评论者和其他一些研究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 笔记本环境一样。

是的,回调很棘手。Async/Await 也有点棘手。你需要等待一切或一无所有(类似的事情)。因此,您必须在本质上是异步的每个函数调用上显式键入 async 和 await。
2021-03-26 01:11:06
声明x没有意义async只需拥有一个正常的功能并return像您最初所做的那样Promise,它更短,更高效,并且具有完全相同的结果。
2021-03-29 01:11:06
在haskell中,他们称之为异步monad
2021-04-03 01:11:06
使用 async if will use then 下面有什么意义?我会理解我们是否可以在下面使用 await 。
2021-04-12 01:11:06

正如其他人所说,您不能在异步函数之外调用“await”。但是,要解决此问题,您可以包装 await x(); 在异步函数调用中。IE,

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 或更高版本。也适用于 chrome canary 片段区域。

所以正如其他人所建议的那样,await 将在异步内工作。所以你可以使用下面的代码来避免使用 then:

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

callX();
谢谢,也忘记了异步。错误应该是“意外的令牌等待”,因为它是无法使用的等待...
2021-04-04 01:11:06