Проблема в этом фрагменте
var userinfoArray = new Array();
for (var i = 0; i < rows.rows.length; i++) {
Promise.all([AES256decrypt(rows.rows[i].admin), AES256decrypt(rows.rows[i].email), AES256decrypt(rows.rows[i].name)])
.then(([adminDecrypt, emailDecrypt, nameDecrypt]) => {
var userinfo = new Object();
userinfo.admin = adminDecrypt;
userinfo.email = emailDecrypt;
userinfo.name = nameDecrypt;
userinfoArray.push(userinfo);
}).catch(callback);
}
socket.emit('UserDataOK', userinfoArray);
заключается в том, что выполнение инструкции
socket.emit('UserDataOK', userinfoArray);
не гарантируется после инициализации массива со всеми для l oop данные, потому что они обрабатываются здесь асинхронно.
Вы можете переместить эту строку к последнему обещанию, добавив элемент в ваш массив следующим образом:
var userinfoArray = new Array();
let expected_array_length = rows.rows.length;
for (var i = 0; i < rows.rows.length; i++) {
Promise.all([AES256decrypt(rows.rows[i].admin), AES256decrypt(rows.rows[i].email), AES256decrypt(rows.rows[i].name)])
.then(([adminDecrypt, emailDecrypt, nameDecrypt]) => {
var userinfo = new Object();
userinfo.admin = adminDecrypt;
userinfo.email = emailDecrypt;
userinfo.name = nameDecrypt;
userinfoArray.push(userinfo);
if(userinfoArray.length == expected_array_length) {
socket.emit('UserDataOK', userinfoArray);
}
}).catch(function(err){expected_array_length -= 1; callback(err)}); // decrease rows.rows.length on your callback for each failing insert
}
Таким образом, вы гарантируете, что сообщение отправляется с последним разрешенным обещанием.
Другой способ - определить обещание, указывающее окончание sh заполнения массива, чтобы вы могли продолжить выполнение кода, пока это обещание разрешается, а затем немедленно отправляет сообщение , Определив
const fillData = function(){
var userinfoArray = new Array();
return new Promise(async function (resolve, reject) {
for (var i = 0; i < rows.rows.length; i++) {
try{
[adminDecrypt, emailDecrypt, nameDecrypt] = await Promise.all([AES256decrypt(rows.rows[i].admin), AES256decrypt(rows.rows[i].email), AES256decrypt(rows.rows[i].name)])
var userinfo = new Object();
userinfo.admin = adminDecrypt;
userinfo.email = emailDecrypt;
userinfo.name = nameDecrypt;
userinfoArray.push(userinfo);
} catch(err){
callback(err)
}
}
resolve(userinfoArray)
})
}
Вы можете вызвать его следующим образом, чтобы отправить сообщение с разрешением обещания
fillData(rows)
.then(function(userinfoArray){
socket.emit('UserDataOK', userinfoArray);
}, function(err){})