Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   задержка в nodejs (https://javascript.ru/forum/node-js-io-js/77783-zaderzhka-v-nodejs.html)

larioninsta 20.06.2019 10:49

задержка в nodejs
 
Доброго времени! прошу помощи, ибо нет больше идей(
Код на nodejs. задача проста, есть MySQL и массив 'DBusers'(в нем иногда лежат данные из ранних запросов).
функция findUserDB ищет пользователя в базе и если есть то добавляет его в массив.
функция findArrayUser ищет пользователя в массиве и если его там нет, то вызывает findUserDB, и потом снова проверяет массив.
Проблема: заключается в том что, добавление в базу и в массив занимает время, а следовательно после первого прохода функции findArrayUser ничего не получаю, даже если пользователь есть и он добавлен в массив DBusers. Исправляет проблему SetTimeout(50ms), но кажется что это не правильно.

Код:

var DBusers = [];

function findUserDB(user_id) {
pool.getConnection(function (err, connection) {
connection.query('SELECT * FROM users WHERE id = ?', [user_id], function (err, resultDB) {
console.log(JSON.stringify(resultDB));
if (resultDB.length != 0) {
DBusers.push(resultDB[0]);
console.log('Записали в ARRAY');
}
connection.release();
});
});
}

function findArrayUser(user_id){
var user = 'none';
DBusers.some(function (value, index) {
if(value['id'] == user_id){
console.log('нашли пользователя в ARRAY');
user = value;
return value['id'] == user_id;
}
});
if(user == 'none'){
console.log('НЕ нашли пользователя в ARRAY, смотрим в базе');
findUserDB(user_id);

НЕ СОГЛАСОВАНИЕ ВРЕМЕНИ ПРОИСХОДИТ ТУТ(findUserDB вроде как добавил, но DBusers.some еще не видит)

DBusers.some(function (value, index) {
if(value['id'] == user_id){
console.log('нашли пользователя в ARRAY');
user = value;
return value['id'] == user_id;
} else {
user = 'no DB';
}
});
}
if(user == 'no DB'){
return JSON.stringify('user not found');
} else {
return JSON.stringify(user);
}
}


Есть возможность в findUserDB сразу вернуть данные пользователя если он есть?
что-то вроде(прошу извинить за подобный код...):

function findUserDB(user_id) {
pool.getConnection(function (err, connection) {
connection.query('SELECT * FROM users WHERE id = ?', [user_id], function (err, resultDB) {
console.log(JSON.stringify(resultDB));
if (resultDB.length != 0) {
DBusers.push(resultDB[0]);
console.log('Записали в ARRAY');
>>>> return resultDB;(ПОНИМАЮ что это в таком виде работать не может)
}
connection.release();
});
});
}

Возможно вопрос банален... знаю, что чего-то не понимаю... поэтому прошу помощи...
заранее благодарен!!

Signal 29.06.2019 22:21

ну я так понял, что проблема у тебя как раз в том, что ты проверяешь в массиве DBusers, а не в самой базе, ты же сам себе дал ответ на свой вопрос
Цитата:

Сообщение от larioninsta
добавление в базу и в массив занимает время,

тебе нужно разделить процессы работы с массивом и с БАЗОЙ, база это так чисто там хранить и если надо получать, сделать тогда этот процесс весь в одну функцию
типа
function GetUserArrayOrDB(nnn, ppp, ggg, callback) {
 //===и уже в этом callback делать дальше, что надо
}


Часовой пояс GMT +3, время: 15:39.