nodejs:async -Promise.then()和await有什么区别?

mrzz3bfm  于 2023-06-05  发布在  Node.js
关注(0)|答案(1)|浏览(257)

我是nodejs的新手,虽然熟悉异步编程的基本概念,但我没有太多编写异步代码的经验。
我正在写一个简单的Web应用程序,它将使用sequelize连接到数据库。开始时,我使用了他们的示例代码(https://sequelize.org/docs/v6/getting-started/):

try {
  await sequelize.authenticate();
  console.log('Connection has been established successfully.');
} catch (error) {
  console.error('Unable to connect to the database:', error);
}

这导致了错误:await is only valid in async functions and the top level bodies of modules。利用我所掌握的一点知识,我将代码改为:

Promise.resolve().then(async () => {
  await sequelize.authenticate();
  console.log('Connection has been established successfully.');
}).catch(error => {
  console.error('Unable to connect to the database:', error);
});

它按预期工作。但据我所知,我的代码的两个版本本质上是完全相同的(除了第一个例子要简单得多,在可读性方面吸引我)
我缺少什么?为什么我不能在我的第一个例子中使用await,“顶级模块体”到底是什么意思?

xzabzqsa

xzabzqsa1#

不能在第一个例子中使用await的原因是(try...catch)所在的代码块不在异步函数中。Wait只能在async函数中使用,这些函数是使用async关键字声明的。
短语“模块的顶级主体”指的是代码运行的上下文。在Node.js中,任何函数或代码块之外的代码都被视为“顶级”。但是,在异步函数之外使用await只允许在模块体(文件)中使用,而不是在全局上下文或常规函数体中使用。
总之,你只能在async函数中使用wait。在第一个例子中,因为代码块不在异步函数中,所以必须将其 Package 在promise中或移动到异步函数中才能使用await。将所有内容 Package 在异步函数中,它应该可以工作。

相关问题