Задать вопрос

Как дождаться в NodeJS выполнения mongodb.forEach и подзапросов и вернуть результат?

Получаю данные с помощью find, прохожу по ним forEach, в каждой итерации нужно выполнить подзапрос, результаты сложить в массив и после этого вернуть их в res.json({..}) ?
  • Вопрос задан
  • 1029 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
@bromzh
Drugs-driven development
promise

UPD
Отвечаю на коммент тут.

В промисах (их есть несколько реализаций, но суть у всех одна) есть функция all, которая вернёт результат промисов всех переданных в неё промисов. Типа такого

Так что можешь создать массив, на каждом шаге цикла оборачивать ответ в промис (если он сам не промис) и потом передать всё в метод all. Например, смотри в конец первого ответа

Примерный код такой:
var queue = [];
cursor.forEach(function (element) {
    queue.push(Promise.resolve(element));
});
Promise.all(queue).then(function(arrayOfResults) {
    // тут делаешь что-то с массивом результатов.
});
Ответ написан
Попробуйте модуль async, очень полезная бибилотека https://github.com/caolan/async
Ответ написан
sopov
@sopov Автор вопроса
Вот так у меня заработало, это правильное решение или нужно иначе?

cursor.forEach(function(doc) {
    var find = {
        pid: doc._id.toString()
    };
    function cnt() {
        return new Promise(function(resolve, reject) {
            self.Struct.find(find).count().then(function(count) {
                var kids = false;
                if(count > 0) {
                    kids = true;
                }
                resolve({
                    id:         doc._id,
                    value:      doc.name,
                    webix_kids: kids
                }); 
            });
        });
    }
    data.push(cnt());		
}, function(err) {
    if(err == null) {
        Promise.all(data).then(function(data){
            res.json({
                success: true,
                error:   0,
                data:    data,
                parent:  pid
            });
        })
    } else {
         reject(err);
    }
});
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы