Это должно быть что-то вроде этого:
db.collection("users").doc(el).collection("grades").get().then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
console.log(doc.id, " => ", doc.data());
const data = doc.data();
members.forEach(el => {
console.log(el)
table_number++;
console.log("forEachMember" + table_number);
const html = populateTable("member_name" + table_number, "layout_table" + table_number);
document.getElementById("main_padding").insertAdjacentHTML('beforeend', html);
addToTable("grade_table" + table_number, doc.id, data.mdl, data.klu);
})
});
});
Дело в том, что сначала нужно выполнить наиболее трудоемкую задачу, в данном случае запрос базы данных, а затем сделать все остальное. Поскольку Javascript является асинхронным, это означает, что он не будет ждать завершения одной инструкции, прежде чем перейти к следующей, он будет пытаться выполнить их все одновременно, если вы не используете обещания.
Существует XF.Server , который в этом вопросе говорит, что он ненадежный. Этот последний вопрос предлагает советы о том, как написать высокопроизводительный сетевой код в .NET (используйте асинхронные сокеты и т. среди прочего, асинхронные вызовы сокетов.
Эта статья MSDN также интересна, но не приближает вас к реальной структуре.
Вы можете взглянуть на SuperSocket, http://supersocket.codeplex.com/ Он может быть не таким сильным, как Mina и Netty, но это довольно простой фреймворк, которым легко пользоваться.