猫鼬与承诺和回调

时间:2020-10-14 14:24:33

标签: node.js mongoose promise

我在理解以下代码与MongoDB连接之间的区别时遇到了问题。

1: mongoose.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, (err) => {
if (err) {
    return err
}
console.log('connected to DB!');
})

2: mongoose.connect(url, { useNewUrlParser: true, useUnifiedTopology: true })
mongoose.connection
   .on('error', (error) => {
        console.warn(error)})
   .once('open', () => {
        console.log('connected to DB!')})

3: mongoose.connect(url, { useNewUrlParser: true, useUnifiedTopology: true })
    .then(() => console.log('connected to DB!'))
    .catch(error => console.log(error))

所以从他们的角度来看,我了解到mongoose.connect返回了Promise,我们必须用.then.catchaync/await来处理Promise,但是在这里它也使用了回调函数。 有人可以向我解释这三种方法吗?

2 个答案:

答案 0 :(得分:0)

数字1和3做同样的事情:它们处理初始连接成功/失败。由于并非每个人都使用诺言,因此他们也提供了一种通过回调来处理诺言的手段。在这两种情况下,都将在第一个连接期间调用回调/承诺,而以后在执行期间失败则不会。当然,您一次只能使用一种功能,即回调或Promise。

数字2添加一个事件侦听器,该侦听器将在每次连接发生错误时触发其回调,而不仅仅是在初始连接期间。除了数字1和3之外,还可以使用它来处理程序生命周期中的错误。

此处有更多信息:https://mongoosejs.com/docs/connections.html#error-handling

答案 1 :(得分:0)

你需要研究和考虑的两件事:

  1. 理解承诺与回调;理解错误处理 (试着抓);理解概念处理(promises; 异步/等待;回调)
  2. 代码#1、#2 和 #3 的含义和作用

关于概念

最近的一些不错的链接:

所以,首先:我建议您充分理解上述不同的概念以及如何处理它们的想法。

然后:将您在问题中谈论的不同概念分开。它们的含义不同,并且没有标准的使用方法:您必须根据您的需要以及您对代码的用途来决定它们的用法。

总结一下:

  • 承诺
<块引用>

表示异步操作最终完成或失败的对象

  • 回调
<块引用>

传递给另一个函数的函数,一旦达到特定状态(返回点;发生错误;做出决定等),后者将调用前​​者

  • 异步/等待
<块引用>

这个概念使得异步代码看起来和行为都像同步代码;并且简化了同步使用promise和对一组promise执行一些行为的行为

  • 尝试...抓住
<块引用>

处理异常的方法 (!!!) - 不一定是处理错误的方法(通常错误会抛出异常,但您也可能希望或需要将它用于不同的目的)

正如您所见,所有这些范式都有不同的含义,并且您可以看到它们以特定方式结合使用。但是,您不一定会被迫按照您通常看到的使用方式使用它们。

关于代码

当您完全理解这些概念时,这是最容易的部分:

  • #1: 使用回调机制 --> 你会连接到一个 MongoDB 数据库,或者,如果在建立连接的过程中发生错误,你会返回一个错误(通过回调机制)
  • #2:混合使用函数调用 mongoose.connect 和链接 --> 在连接时你没有处理最终的错误(所以这最终会成为一个问题);然后,如果已连接,如果在连接打开期间发生错误,您将向控制台写入警告;当连接打开时(如果前面的语句 mongoose.connect(...) 成功,则说明数据库已连接
  • #3:仅使用链接概念 --> 您正在尝试建立连接;然后,如果成功,您就已连接;然后,如果不成功,你会发现错误

希望这会有所帮助。 ;)