Я занят работой над конечной точкой для системы отчетности. Узел async дает мне проблемы, хотя я бы не хотел, чтобы он был синхронным.Node.js looping async calls
Мы используем MongoDB и Mongoose. Мне нужно запросить regex над сборкой A, затем для каждого возвращаемого документа запросите несколько документов, чтобы заполнить возвращаемый объект/массив JSON.
Для большинства данных я могу использовать populate
, за исключением окончательных запросов с петлями, в которых асинхронно запускается и возвращает мой отчет раньше. Есть ли элегантный способ сделать это? Или я должен раскалываться на другую функцию и называть это несколько раз, чтобы придерживаться правила functions should do only one thing
?
Пример кода:
A.find({ name: regex }).populate({ path: 'B', populate: { path: 'B.C', model: 'C' } }).exec(function(err, A) {
var report = [];
A.map(function(a)){
report[a.name] = [];
D.aggregate([
{
$match: {
id: B._id
}
},
{
$group: {
_id: null,
count: { $sum: 1 }
}
}
], function(err, result) {
C.map(function(c){
report[a.name].push({
'field1': c.field1,
'field2': c.field2,
'field3': c.field3,
'count': result.count
});
});
});
}
return report;
});
Проблема здесь с логикой/асинхронном. Не с синтаксисом, следовательно, с полу-псевдокодом.
Любая помощь или совет были бы очень признательны.
В этом коде отчет будет возвращен после первой итерации документов C. – nickcorin
К сожалению, вы правы, но знаете, где вернуть объект отчета, я бы исправил ответ –
В этом проблема, которую я испытываю. Если я верну 'отчет' в конце функции, он будет пустым. Это связано с тем, что, как только запускается функция 'aggregate', async запускает и продолжает обрабатывать текущую функцию. Это приводит к удалению оператора return перед заполнением отчета. – nickcorin