Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.01.2015, 20:55
Аспирант
Отправить личное сообщение для biperch Посмотреть профиль Найти все сообщения от biperch
 
Регистрация: 10.07.2013
Сообщений: 34

Перезапись переменной
Добрый день такая вот проблема.
В цикле перебираю номера сокетов и для каждого сокета получаю 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);
                                            }
                                        }
Ответить с цитированием
  #2 (permalink)  
Старый 27.01.2015, 22:08
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

А jQuery тут причем?
Если есть возможность запустить ноду с поддержкой es6, то можешь заменить var x на let x, и все заработает. Хотя я не в теме насчет es6 в ноде.

Ну а старый дедовский способ - обернуть тело цикла в анонимную самовызывающуюся функцию (function(){ /* тело */ }()
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #3 (permalink)  
Старый 28.01.2015, 00:37
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

А ещё можно использовать метод .forEach. И всё само собой разрулится.
Ответить с цитированием
  #4 (permalink)  
Старый 28.01.2015, 01:05
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Sweet
А ещё можно использовать метод .forEach
Не можно, а, думаю, нужно! Чет мне не пришло в голову..
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #5 (permalink)  
Старый 28.01.2015, 01:50
Аспирант
Отправить личное сообщение для biperch Посмотреть профиль Найти все сообщения от biperch
 
Регистрация: 10.07.2013
Сообщений: 34

Сообщение от danik.js Посмотреть сообщение
Не можно, а, думаю, нужно! Чет мне не пришло в голову..
так и поступил, спасибо

А почему в этой ветке пишу, потому что активность тут по выше, а суть та же.
Ответить с цитированием
  #6 (permalink)  
Старый 28.01.2015, 01:59
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Запросы к базе данных в цикле делать не очень хорошо. Подумай о логике, что и где можно изменить. К примеру как все собрать в один большой запрос
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перезапись переменной biperch AJAX и COMET 1 28.01.2015 01:53
Вернуть имя переменной Йакуд Общие вопросы Javascript 21 18.05.2014 10:10
посылка переменной kent0026 jQuery 5 04.01.2014 17:34
Как значение переменной вставить в имя переменной? jsgogo Общие вопросы Javascript 3 02.06.2013 12:11
Передать значение этой переменной скрипту пхп не обновляя страницы jei Общие вопросы Javascript 10 01.03.2013 18:14