Я только неделю изучаю бэкенд на node, поэтому мой вопрос может показаться вам очень смешным или странным, судите строго, буду только рад критике.
Какая задача вызвала у меня затруднение? Клиент начинает загружать страницу и отсылает id страницы, дальше сервер принимает это id (тут код работает отлично, поэтому я не приложил его ) и получает всех друзей пользователя, дальше сервер проходиться по полученному списку друзей и возвращает информацию о каждом друге в JSON строке, вместе с общим количеством друзей. Вот код :
GetAllFriends(id:number) {
if (id == 0) {
return JSON.stringify({
status: 400,
count: null,
array: null
});
}
return new Promise( (res, rej) => {
this.UserRepository.findOne({
attributes: ['friends'],
where: {id: id}
}).then( async (Res) => {
const Response = JSON.parse(Res.friends);
if (Response.count != null && Response.count > 0) {
let Array:number[], JsonToResponse: {count: number, array: any[]};
if (Response.array.length > 0) {
Array = Response.array.split(",");
JsonToResponse = {
count: Response.count,
array: []
};
Array.map( async (value) => {
try{
const result = await this.UserRepository.findOne({
attributes: ['avatar', 'name', 'surname'],
where: {id: value}
});
if (result.name && result.name != '' && result.name != null) {
JsonToResponse.array.push( {
avatar: result.avatar,
name: result.name,
surname: result.surname,
id: value
});
}
} catch (err) {
console.log(err)
}
});
console.log(JsonToResponse)
return res( JSON.stringify({
status: 200,
message: 'kk',
json: JSON.stringify(JsonToResponse)
}) )
} else {
return res('{"status": "400", "Message":"No friends"}');
}
} else {
return res('{"status": "400", "Message":"No friends"}')
}
}).catch( err => {
return res('{"status": "400", "Message":"No friends"}')
})
})
}
Тут я столкнулся с неожиданной ошибкой, для которой я даже костыль придумать не способен. Порядок действий очень странный. Сначала сервер получает пользователя ( тут всё нормально ), потом он начинает перебирать его друзей:
сначала отработает код до Array.map(), потом любой код внутри Array.map(), несвязанный с result (увеличение переменной, console.log и так далее), затем я увижу на экране результат строки
console.log(JsonToResponse)
затем сервер вернёт результат и только потом я увижу в консоли запросы к БД. Таким образом JSON строка не содержит никакой информации о пользователях, так как эта информация загружается после ответа. Как сделать поведение сервера ожидаемым:
получение пользователя, затем перебор всех друзей с запросом к БД и добавлением этой информации в массив, затем
результат строки
console.log(JsonToResponse)
и только затем вывод?