📌  相关文章
📜  仅当 'module' 选项设置为 'esnext' 或 'system' 并且 'target' 选项设置为 'es2017' 或更高版本时,才允许使用顶级 'await' 表达式. - Javascript(1)

📅  最后修改于: 2023-12-03 15:21:51.453000             🧑  作者: Mango

仅当 'module' 选项设置为 'esnext' 或 'system' 并且 'target' 选项设置为 'es2017' 或更高版本时,才允许使用顶级 'await' 表达式.

简介

JavaScript是现代Web开发中最常用的编程语言之一。其支持异步编程, 通过将任务添加到事件循环中,并等待执行完成从而避免了阻塞主线程。 ES2017引入了顶级await表达式,可在异步函数外部使用,它可以将异步编程带入到一个新的层次段。它允许我们以同步的方式编写异步代码,并能更好地处理异步异常。

如果没有特殊的配置,JavaScript 环境中是无法使用顶层 await 表达式的。这是因为顶层 await 可能会导致代码在其余模块装载之前启动

如何使用顶级await表达式

在使用顶级await表达式之前,我们需要在JavaScript代码中进行配置, 设置’module‘选项为’ESNext’或‘system’,并将’目标‘选项设置为ES2017或更高版本。这样我们可以在整个项目中使用顶级’await‘表达式。

以下是一个示例代码,展示了如何使用顶层await表达式处理异步请求

// module esnext or system is needed, and with target set to es2017 or above
ModelingLayer.handleIncomingMessage = async (req, res, next) => {
  const [adapter0, adapter1] = await Promise.all([
    adapterFactory0(req),
    adapterFactory1(req)
  ]);

  const adapter0Result = await adapter0.query(db);
  const validationResults = await Promise.all([
    Promise.resolve(ModelValidation.validateQuery(adapter0Result)),
    Promise.resolve(ModelValidation.validateParams(req.query))
  ]);

  res.locals.validationResults = validationResults[0];
  res.locals.adapterResults = {
    adapter0: adapter0Result,
    adapter1: await adapter1.find(req.params.id)
  };

  next();
};
结论

在项目中使用顶层await表达式允许我们以同步的方式编写异步代码,使代码更加简洁易懂,并且更容易处理异步异常。但是,我们需要考虑相关配置,以确保代码在其余模块装载之前启动。