Я наткнулся на фрагмент кода Mongoose, который включал запрос findOne, а затем функцию exec ().
Я никогда раньше не видел этот метод в Javascript? Что именно он делает?
источник
Я наткнулся на фрагмент кода Mongoose, который включал запрос findOne, а затем функцию exec ().
Я никогда раньше не видел этот метод в Javascript? Что именно он делает?
Обычно при использовании мангуста документы можно получить с помощью помощников. Каждый метод модели, который принимает условия запроса, может быть выполнен с помощью метода callback
или exec
метода.
callback
:
User.findOne({ name: 'daniel' }, function (err, user) {
//
});
exec
:
User
.findOne({ name: 'daniel' })
.exec(function (err, user) {
//
});
Поэтому, когда вы не передаете обратный вызов, вы можете создать запрос и в конечном итоге выполнить его.
Вы можете найти дополнительную информацию в документации мангуста .
ОБНОВИТЬ
При использовании обещаний в сочетании с асинхронными операциями Mongoose следует отметить, что запросы Mongoose не являются обещаниями. Запросы действительно возвращают значение , но если вам нужно настоящее обещание, вы должны использовать этот exec
метод. Более подробную информацию можно найти здесь .
Во время обновления я заметил, что не ответил прямо на вопрос:
Я никогда раньше не видел этот метод в Javascript? Что именно он делает?
Ну, это не собственный метод JavaScript, а часть API Mongoose.
exec
метод. По крайней мере, это то, что они делают в документации. Конечно, вы можете проверить себя с помощьюModel.find() instanceof require('bluebird')
. Надеюсь это поможет.Model.update().exec()
убедиться, что он будет выполнен. Затем вы можете ответить на api, не дожидаясь обновления.Дэниел ответил на это довольно красиво. Чтобы разработать исчерпывающий список способов построения и выполнения запросов, рассмотрите следующие варианты использования:
Построение запросов
Mongoose не выполнит запрос до тех пор ,
then
илиexec
была вызвана на него. Это очень полезно при построении сложных запросов. Некоторые примеры могут включать в себя , используяpopulate
иaggregate
функции.Выполнение через обратный вызов
Хотя это не нравится многим из-за его вложенности, запросы можно выполнять, предоставляя дополнительный обратный вызов.
Тогда API как обещание / A +
Запросы Mongoose действительно предоставляют
then
функцию. Это не следует путать с обычными обещаниями. Проще говоря, спецификация Promises / A + требует, чтобыthen
функция работала так же, как мы привыкли с обещаниями.Функция exec
Из документации Mongoose
If you need a fully-fledged promise, use the .exec() function.
источник
then
запрос для возврата обещания. Это не сильно отличается отexec
. Вариант использования, который я считаю удобным, - это использование чего-то вродеPromise.all
. Не уверен, что обещание, возвращаемое функцией,exec
работает в таких контекстах.exec()
вернет обещание, если обратный вызов не предоставлен. Таким образом, следующий шаблон очень удобен и универсален - он отлично справляется с обратными вызовами или обещаниями:Я рекомендую использовать обещания Bluebird с Mongoose, для этого используйте этот вызов:
источник