我正在尝试使用Node版本6.2.1和我的一些代码。计划将大多数面向超回调的代码迁移到看起来更干净且可能表现更好的代码。
我不知道为什么,当我尝试执行节点代码时终端抛出错误。
helloz.js
(async function testingAsyncAwait() {
await console.log("Print me!");
})();
日志 -
BOZZMOB-M-T0HZ:rest bozzmob$ node helloz.js
/Users/bozzmob/Documents/work/nextgennms/rest/helloz.js:1
(function (exports, require, module, __filename, __dirname) { (async function testingAsyncAwait() {
^^^^^^^^
SyntaxError: Unexpected token function
at Object.exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:513:28)
at Object.Module._extensions..js (module.js:550:10)
at Module.load (module.js:458:32)
at tryModuleLoad (module.js:417:12)
at Function.Module._load (module.js:409:3)
at Function.Module.runMain (module.js:575:10)
at startup (node.js:160:18)
at node.js:456:3
BOZZMOB-M-T0HZ:rest bozzmob$ node -v
v6.2.1
我错过了什么?请给我一些启示。
更新1:
我尝试使用Babel作为Quentin建议,但是,我仍然收到以下错误。
更新的代码 -
require("babel-core/register");
require("babel-polyfill");
(async function testingAsyncAwait() {
await console.log("Print me!");
})();
日志 -
BOZZMOB-M-T0HZ:rest bozzmob$ babel helloz.js > helloz.trans.js
SyntaxError: helloz.js: Unexpected token (3:7)
1 | require("babel-polyfill");
2 |
> 3 | (async function testingAsyncAwait() {
| ^
4 | await console.log("Print me!");
5 | })();
异步函数是not supported by Node versions older than version 7.6。
如果您使用的是旧版本,则需要将代码(例如使用Babel)转换为Node理解的JS版本。
也就是说,当前的(2018)LTS版本的Node.js是8.x,所以如果你使用的是早期版本,你应该非常强烈地考虑升级。
Nodejs支持7.6版本的async / await。
发布帖子:https://v8project.blogspot.com.br/2016/10/v8-release-55.html
Node.JS当前不完全支持ES6,因此您可以使用asyncawait模块或使用Bable进行转换。
安装
npm install --save asyncawait
helloz.js
var async = require('asyncawait/async');
var await = require('asyncawait/await');
(async (function testingAsyncAwait() {
await (console.log("Print me!"));
}))();
如果您只是在试验,可以使用babel-node
命令行工具来试用新的JavaScript功能
babel-cli
安装到您的项目中
$ npm install --save-dev babel-cli
$ npm install --save-dev babel-preset-es2015 babel-preset-es2017
.babelrc
:
{ "presets": ["es2015","es2017"] }
babel-node
运行脚本
$ babel-node helloz.js
这仅用于开发和测试,但这似乎就是你正在做的事情。最后,您需要设置webpack(或类似的东西)来转换所有代码以进行生产
如果你想在其他地方运行代码,webpack可以提供帮助,这是我可以解决的最简单的配置:
node v6.6.0
如果你只是用在开发中。你可以这样做:
npm i babel-cli babel-plugin-transform-async-to-generator babel-polyfill --save-dev
package.json
会是这样的:
"devDependencies": {
"babel-cli": "^6.18.0",
"babel-plugin-transform-async-to-generator": "^6.16.0",
"babel-polyfill": "^6.20.0"
}
创建.babelrc
文件并写下:
{
"plugins": ["transform-async-to-generator"]
}
然后,像这样运行你的async/await
脚本:
./node_modules/.bin/babel-node script.js
虽然我来晚了,但对我来说有用的是安装transform-async-generator和transform-runtime插件,如下所示:
npm i babel-plugin-transform-async-to-generator babel-plugin-transform-runtime --save-dev
package.json
会是这样的:
"devDependencies": {
"babel-plugin-transform-async-to-generator": "6.24.1",
"babel-plugin-transform-runtime": "6.23.0"
}
创建.babelrc
文件并写下:
{
"plugins": ["transform-async-to-generator",
["transform-runtime", {
"polyfill": false,
"regenerator": true
}]
]
}
然后用async/await
快乐编码
包含并指定最新的节点引擎版本,比如此时我添加了版本8。
{
"name": "functions",
"dependencies": {
"firebase-admin": "~7.3.0",
"firebase-functions": "^2.2.1",
},
"engines": {
"node": "8"
},
"private": true
}
在以下文件中
的package.json
节点正在快速变化,所以我认为发布和更新可能会有所帮助:
这时我正在运行节点VER 8.11.4,并且以下代码工作正常,无需安装asychawait:
function resolveAfter2Seconds() {
return new Promise(resolve => {
setTimeout(() => {
resolve('resolved');
}, 2000);
});
}
async function asyncCall() {
console.log('calling');
var result = await resolveAfter2Seconds();
console.log(result);
// expected output: 'resolved'
}
asyncCall();
此示例和更多详细信息发布在此处:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function