Мангуст с обещанием и обратным вызовом

#node.js #mongoose #promise

#node.js #мангуст #обещание

Вопрос:

У меня возникла проблема с пониманием разницы между следующим фрагментом кода при подключении к 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 они возвращают обещание, и мы должны обрабатывать обещание с помощью eihter .then.catch или aync/await , но здесь также используется функция обратного вызова.
Может кто-нибудь объяснить мне эти 3 метода?

Комментарии:

1. В ваших трех примерах единственное отличие заключается в том, как обрабатываются ошибки ( console.log console.warn против игнорирования). В общем, они делают то же самое, не уверен, что именно вы хотите объяснить. Посмотрите на использование в реальном коде.

2. Я на самом деле спрашивал, возможно ли всегда обрабатывать обещание с помощью функций обратного вызова? потому что я знал, что мы справимся с этим с помощью. затем и асинхронный / ожидание

3. Мне все еще не ясно. То, что вы передаете then , и catch является функциями обратного вызова. Это так?

Ответ №1:

Номера 1 и 3 делают то же самое: они обрабатывают первоначальный успех / сбой соединения. Поскольку не все используют обещания, они предлагают средство для обработки этого с помощью обратного вызова. В обоих случаях обратный вызов / обещание будет вызываться во время первого соединения, более позднего сбоя во время выполнения не будет. Вы, конечно, должны использовать только одну функцию одновременно, либо обратный вызов, либо обещание.

Номер 2 добавьте средство прослушивания событий, которое будет запускать его обратный вызов каждый раз, когда возникает ошибка с подключением, а не только во время первоначального подключения. Его можно использовать в дополнение к номерам 1 и 3 для обработки ошибок в течение срока службы вашей программы.

Дополнительная информация здесь: https://mongoosejs.com/docs/connections.html#error-handling

Комментарии:

1. Спасибо, но, насколько мне известно, я обрабатываю обещание с помощью .then/.catch ИЛИ async/await . Никогда не обрабатывал обещания с обратными вызовами, и я запутываюсь

2. Вы правы в отношении обработки обещаний. Вы не обрабатываете обещание с обратным вызовом: мангуст вызывает обратный вызов, если он предоставлен, в противном случае он возвращает обещание.

Ответ №2:

Две вещи, которые вам нужно изучить и принять во внимание:

  1. понимание обещаний и обратных вызовов; понимание обработки ошибок (попробуйте … поймать); понимание обработки концепций (обещания; асинхронный / ожидание; обратный вызов)
  2. что означает и выполняет код # 1, # 2 и # 3

О концепциях

Некоторые довольно хорошие недавние ссылки:

Итак, во-первых: я бы посоветовал вам полностью понять различные концепции, приведенные выше, и идеи о том, как с ними обращаться.

Затем: разделите различные концепции, о которых вы говорите в своем вопросе. Они означают разные вещи, и стандартного способа их использования не существует: вы должны принять решение об их использовании на основе того, что вам нужно, и того, что вы делаете со своим кодом.

Подводя итог:

  • Обещание

объект, представляющий возможное завершение или сбой асинхронной операции

  • Обратный вызов

функция, переданная в другую функцию, в которой последняя вызовет первую, как только будет достигнут определенный статус (точка возврата; возникновение ошибки; принятое решение и т. Д.)

  • асинхронный / ожидающий

эта концепция заставляет асинхронный код выглядеть и вести себя как синхронный код; и это упрощает поведение при использовании обещаний синхронно и для выполнения некоторого поведения над группой обещаний

  • попробуйте … поймать

метод для обработки исключений (!!!) — не обязательно метод для обработки ошибок (обычно ошибка вызывает исключение, но вы можете захотеть или использовать его для других целей)

Как вы можете видеть, все эти парадигмы имеют разные значения, и вы можете видеть, что они используются в сочетании определенным образом. Однако вы не обязательно вынуждены использовать их так, как вы обычно видите, что они используются.

В коде

Это самая простая часть, когда вы полностью понимаете концепции:

  • # 1: Использование механизма обратного вызова -> вы будете подключены к базе данных MongoDB или, если в процессе установления соединения возникает ошибка, вы вернете ошибку (через механизм обратного вызова)
  • # 2: используя сочетание вызова функции mongoose.connect и цепочки -> вы не обрабатываете возможные ошибки при подключении (так что это в конечном итоге станет проблемой); затем, ЕСЛИ ПОДКЛЮЧЕНО, если ошибка возникает во время открытия соединения, вы пишете предупреждение на консоль; когда соединение прерывается.открыть (если предыдущее утверждение mongoose.connect(...) было успешным, вы указываете, что база данных подключена
  • # 3: использование только концепции цепочки -> вы пытаетесь установить соединение; затем, в случае успеха, вы подключены; затем, если не удалось, вы перехватываете ошибку

Надеюсь, это поможет. 😉