@Xsader

Можно ли сделать переменные, определяемые в методе .exec, глобальными?

Чтобы вытащить из MongoDB значение записи я использую mongoose метод .find и определяю запись методом .exec, но другие переменные, определённые в этом методе, действуют только в его рамках, так как сам метод возвращает пустой массив. Можно ли этого избежать и сделать переменную глобальной для скрипта (не используя таймаут), или использовать метод, отличающийся от .exec для выполнения задачи?
На SO нашёл пример, сходный моему, но подходящего ответа там нет.
var all_mail;
mailModel.find().exec((err, docs) =>{ // Дёргаем массив записей и определяем его как docs
     all_mail = docs;
});
console.log(all_mail);  // Ошибка
  • Вопрос задан
  • 128 просмотров
Решения вопроса 1
lastuniverse
@lastuniverse
Всегда вокруг да около IT тем
Для начала разбор Вашего варианта:
var all_mail;
mailModel.find().exec((err, docs) =>{
     // данный код не будет выполнен сразу, он будет выполнен только через какоето время.
     // дело в том, что пока бд сделает выборку и отдаст результат 
     // может пройти определенное время. Чтобы избежать простоев, 
     // в данном случае метод exec выполняется асинхронно
     // то есть тело данной функции будет вызвано не ранее чем от БД будут получены данные
     // а js тем временем продолжит выполнение кода дальше
     all_mail = docs;
});

// и придет сюда. но так как docs от БД еще не получен, all_mail все еще равен undefined.
console.log(all_mail);  // Ошибка


Теперь посмотрим как же нам добиться своевременной обработки результата:
// добро пожаловать в асинхронность
var all_mail;

mailModel.find().exec((err, docs) =>{
     // в all_mail засовываем промис(обещание) того, что в скором времени будет результат
     all_mail  = new Promise((resolve, reject)=>{
           resolve(docs);
     });

});

all_mail.then((data)=>{
     // когда же результат будет получен, обрабатываем его
     console.log(data);  // все ок)
});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Fundraise Up Санкт-Петербург
от 140 000 до 200 000 руб.
Leningrad Media Санкт-Петербург
от 80 000 до 150 000 руб.
15 окт. 2019, в 17:38
5000 руб./за проект
15 окт. 2019, в 17:15
7000 руб./за проект