Answer the question
In order to leave comments, you need to log in
Is it possible to make variables defined in the .exec method global?
To pull the value of an entry from MongoDB, I use the mongoose .find method and define the entry with the .exec method, but the other variables defined in this method only have an effect within it, since the method itself returns an empty array. Is it possible to avoid this and make the variable global to the script (without using a timeout), or use a method other than .exec to complete the task?
On SO I found an example similar to mine, but there is no suitable answer there.
var all_mail;
mailModel.find().exec((err, docs) =>{ // Дёргаем массив записей и определяем его как docs
all_mail = docs;
});
console.log(all_mail); // Ошибка
Answer the question
In order to leave comments, you need to log in
Let's start with your analysis:
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); // все ок)
});
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question