X
X
Xsader2019-06-15 16:59:22
JavaScript
Xsader, 2019-06-15 16:59:22

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

1 answer(s)
R
Roman, 2019-06-15
@Xsader

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);  // Ошибка

Now let's see how we achieve timely processing of the result:
// добро пожаловать в асинхронность
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 question

Ask a Question

731 491 924 answers to any question