Когда вы выполняете эту операцию:
Video.find(function(err, data) {
// something
console.log("one")
})
// nothing
console.log("two")
Функция в скобках - это обратный вызов операции find()
. Это означает, что он будет отозван, когда выполнение find завершится, и он может использовать параметры err
или data
внутри своей области. Он выполнит console.log("one")
. Такой способ «ожидания» результатов обусловлен асинхронным характером js.
Вместо этого код вне метода обратного вызова будет запущен сразу после того, как поиск будет вызван , и он не будет ждать, пока операция поиска будет завершена . Следовательно, в этом примере two
будет напечатано перед one
.
В вашем примере переменная videos
, которую вы пытаетесь напечатать вне метода обратного вызова console.log(videos)
, пуста, как и напечатанная перед videos
действительно есть.
Вы должны написать весь свой код обратного вызова в случае !err
:
if (!err) {
videos = foundVideo.slice(0)
console.log(videos) // this return me with an object array [{obj1}, {obj2}]
}
Обновить
Как вы заметили, кодировщик вынужден реализовывать код в методе обратного вызова. Затем другие методы или запросы, зависящие от данных из первого запроса, как правило, усложняют структурирование кода. разделы.