Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Перезапись переменной (https://javascript.ru/forum/jquery/53273-perezapis-peremennojj.html)

biperch 27.01.2015 20:55

Перезапись переменной
 
Добрый день такая вот проблема.
В цикле перебираю номера сокетов и для каждого сокета получаю 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);
                                            }
                                        }

danik.js 27.01.2015 22:08

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

Ну а старый дедовский способ - обернуть тело цикла в анонимную самовызывающуюся функцию (function(){ /* тело */ }()

Sweet 28.01.2015 00:37

А ещё можно использовать метод .forEach. И всё само собой разрулится.

danik.js 28.01.2015 01:05

Цитата:

Сообщение от Sweet
А ещё можно использовать метод .forEach

Не можно, а, думаю, нужно! Чет мне не пришло в голову..:(

biperch 28.01.2015 01:50

Цитата:

Сообщение от danik.js (Сообщение 353806)
Не можно, а, думаю, нужно! Чет мне не пришло в голову..:(

так и поступил, спасибо

А почему в этой ветке пишу, потому что активность тут по выше, а суть та же.

Vlasenko Fedor 28.01.2015 01:59

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


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