Перезапись переменной
Добрый день такая вот проблема.
В цикле перебираю номера сокетов и для каждого сокета получаю user_id после чего из бд достаю профиль и заполняю нужные поля. запросы в бд выполняются асинхронно, для удобства сокет_is записываю в var new_ws_id = connectionsId[z]; после чего надеюсь его во втором вложенном калбеке использовать. Но получается что к тому времени как начинает выполнятся первый внутренний калбек, цикл проходит до конца и перезаписывает new_ws_id самым последним значением из массива. Помогите избежать этого.
var connections_count = connectionsId.length,
new_connections = [];
console.log('List ws_id', connectionsId);
for(var z=0; z<connections_count; z++){
try {
var new_ws_id = connectionsId[z];
db.getIDbyWS(new_ws_id, function(new_user_id) {
db.getUserProfile(new_user_id, function(new_profile){
new_connections.push( {
socketId : new_ws_id,
user_id : new_user_id,
user_first_name : new_profile.user_first_name,
user_last_name : new_profile.user_last_name
});
if (new_connections.length==connections_count) {
// send new peer a list of all prior peers
socket.transmit('get_peers', {
connections: new_connections
});
console.log('New list ws_id', new_connections);
}
});
});
}catch (e){
console.log('E260120151636', e);
}
}
|
А jQuery тут причем?
Если есть возможность запустить ноду с поддержкой es6, то можешь заменить var x на let x, и все заработает. Хотя я не в теме насчет es6 в ноде. Ну а старый дедовский способ - обернуть тело цикла в анонимную самовызывающуюся функцию (function(){ /* тело */ }() |
А ещё можно использовать метод .forEach. И всё само собой разрулится.
|
Цитата:
|
Цитата:
А почему в этой ветке пишу, потому что активность тут по выше, а суть та же. |
Запросы к базе данных в цикле делать не очень хорошо. Подумай о логике, что и где можно изменить. К примеру как все собрать в один большой запрос
|
| Часовой пояс GMT +3, время: 08:12. |