
这篇文章是我今天学习系列的一部分,我在其中分享了我所有的 Web 开发学习。
Node.js 是一个用于编写快速实用程序脚本的漂亮工具。我在许多构建过程中都使用它。重命名文件、下载数据、图像处理——Node.js 脚本处理我项目中的许多任务。
不过,有一个小小的烦恼。在处理诸如发出网络请求之类的异步功能时,Node.js (尚) 中没有顶级 await 支持。
该await关键字允许您解开基于 Promises 的代码,避免链式then调用并使源代码更具可读性。
// promise-based code
Promise.resolve('hello world').then((asyncMsg) => {
console.log(msg);
});
// async/await code
const asyncMsg = await Promise.resolve('hello world');
console.log(msg);不幸的是,如果不将await关键字包装在async函数中,就无法使用它。
// use an async IIFE
(async () => {
const asyncMsg = Promise.resolve('hello world');
console.log(asyncMsg);
})();
// use an async main function
async function main() {
const asyncMsg = Promise.resolve('hello world');
console.log(asyncMsg);
}
main();虽然将代码包装在 anasync function中并不可怕,但其全部目的是启用await关键字。有没有更好的办法?我们可以async在 Node.js 代码中避免这些包装器吗?顶级等待现在来救援!
await在 Node.js 中“未标记”可用,因为v14.8从 Node.js 开始v14.8,顶级 await 可用(不使用--harmony-top-level-await命令行标志)。
有一个问题:顶级 await 仅在 ES 模块中可用。有三种方法可以使 Node.js 脚本成为 EcmaScript 模块。
请注意,如果你在的Node.js使ES模块,你必须改变所有require,并module声明与他们import和export同行。
mjs文件扩展名使用.mjs文件扩展名并收工!🎉
// File: index.mjs
//
// Command line usage: node index.mjs
const asyncMsg = await Promise.resolve('WORKS!');
console.log(asyncMsg); // "WORKS!"如果你正在开发一个包,你也可以type在你的包中定义属性package.json来声明它是基于 ECMAscript 模块的。
// File: index.js
// (near package.json including { "type": "module" })
//
// Command line usage: node index.js
const asyncMsg = await Promise.resolve('WORKS!');
console.log(asyncMsg); // "WORKS!"input-type在评估字符串输入时定义有时您可能需要将代码通过管道传输到 Node.js 二进制文件中或使用eval标志。使用该input-type标志指定传递的字符串值是一个 ECMAscript 模块。
node --input-type=module \
--eval="const asyncMsg = await Promise.resolve('WORKS!'); console.log(asyncMsg);"很美,顶级await终于进入了Node.js!我可能会坚持.mjs使用文件扩展名在我的脚本中使用它。将脚本文件从jsto重命名mjs是快速完成的,并且不会引入重大更改。

本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。