Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.06.2019, 10:49
Новичок на форуме
Отправить личное сообщение для larioninsta Посмотреть профиль Найти все сообщения от larioninsta
 
Регистрация: 20.06.2019
Сообщений: 1

задержка в 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();
});
});
}

Возможно вопрос банален... знаю, что чего-то не понимаю... поэтому прошу помощи...
заранее благодарен!!
Ответить с цитированием
  #2 (permalink)  
Старый 29.06.2019, 22:21
Аспирант
Отправить личное сообщение для Signal Посмотреть профиль Найти все сообщения от Signal
 
Регистрация: 03.05.2016
Сообщений: 72

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вакансия NodeJS разработчика World IT Работа 0 24.10.2018 11:57
Парсинг с помощью NodeJS forklive Node.JS 0 29.03.2018 18:31
NodeJS + RubyOnRails (require is not a function...) morezen10 Node.JS 1 04.10.2017 10:54
Разница между собранным пакетом nodeJS и установленным из бинарного образа freeneutron Node.JS 1 10.11.2015 11:41
Comet: NodeJS - с чего начать разработку? Vulkan AJAX и COMET 13 27.11.2010 18:25