У меня проблема с манипулированием глобальным массивом.
Код работает хорошо, если он написан так
function getChatBox(originMessage) {
return new Promise((resolve, reject) => {
resolve(
Message.aggregate([
{
$match: { _id: originMessage }
},
{
$unwind: "$subMessages"
},
{
$lookup: {
from: "messages",
localField: "subMessages",
foreignField: "_id",
as: "chained"
}
},
{
$unwind: "$chained"
},
{
$project: { chained: 1, _id: 0 }
}
])
);
});
}
let chatBoxes = [];
if (user.messages.length > 0) {
user.messages.forEach(async msg => {
//let chatBox = await getChatBox(msg.originMessage);
//chatBoxes.push(chatBox);
//chatBoxes.push(await getChatBox(msg.originMessage));
chatBoxes.push("cool");
console.log(chatBoxes);
});
}
console.log("outer", chatBoxes);
И вывод такой, когда он работает
Однако, как только я добавляю строку кода (для извлечения данных избаза данных) доза глобального массива не изменяется.
между ** ** - строка добавленного кода (пусть chatBox = await getChatBox (msg.originMessage);):
function getChatBox(originMessage) {
return new Promise((resolve, reject) => {
resolve(
Message.aggregate([
{
$match: { _id: originMessage }
},
{
$unwind: "$subMessages"
},
{
$lookup: {
from: "messages",
localField: "subMessages",
foreignField: "_id",
as: "chained"
}
},
{
$unwind: "$chained"
},
{
$project: { chained: 1, _id: 0 }
}
])
);
});
}
let chatBoxes = [];
if (user.messages.length > 0) {
user.messages.forEach(async msg => {
**let chatBox = await getChatBox(msg.originMessage);**
//chatBoxes.push(chatBox);
//chatBoxes.push(await getChatBox(msg.originMessage));
chatBoxes.push("cool");
console.log(chatBoxes);
});
}
console.log("outer", chatBoxes);
И вывод показывает это: Я не знаю, почему меняется порядок журналов
Пожалуйста, помогите мне понять, чтопроисходит.Я хочу вставить в глобальный массив (chatBoxes) извлеченные данные, но вне функции массив все еще пуст (не пуст, если я добавляю в функцию простую строку).
Я подозреваю, что код послеforEach запускается до завершения цикла.Может в этом проблема?
Спасибо!