Задать вопрос

Как получить доступ к переменной в javascript?

Использую nodejs+expressjs для создания проекта. Имею следующего вида код:

User.prototype.join = fucntion(user,res){
var _errors = [];
for(var i = 0; i < user.length; i++){
(function(i){
if(user[i].required && !user[i].value) _errors.push('Вы не ввели логин'); // РАБОТАЕТ {1}
if(user[i].unique == true){
pg.any('SELECT id FROM users WHERE login=$1',[user[i].value])
.then(function(user){
if(user.length) _errors.push('Пользователь с таким логином уже зарегистрирован'); // НЕ РАБОТАЕТ {2}
});
}})(i);
}
res[0].error = _errors; // ЗДЕСЬ РЕЗУЛЬТАТ ОТДАЕТСЯ РОУТАМ И ВСЕ ЭТО ВЫВОДИТСЯ В JSON ФОРМАТЕ {3}
}


Помогите, пожалуйста: не могу получить доступ к переменной в случае {2}. Точнее, не могу передать результат ее исполнения, чтобы он попал на позицию {3}.

Пробовал переменную и локальной делать и глобальной, и всяко разно крутил - не получается.

В JavaScript, а тем более в node.js не спец - в универе дали задачу с морем готового кода. Сказали - допилить, не удаляя того, что уже имеется.
  • Вопрос задан
  • 186 просмотров
Подписаться 1 Оценить 4 комментария
Решения вопроса 1
Функция pg.any асинхронная, и как следствие res[0].error = errors; выполняется раньше обработки уникальных логинов. Чтобы работало правильно нужно отложить работу с ошибками до момента исполнения всех запросов к БД:

User.prototype.join = function (user, res) {
    var errors = [],
        unique = [];

    for (var i = 0; i < user.length; i++) {
        if (user[i].required && !user[i].value) {
            errors.push('Вы не ввели логин');
        }

        if (user[i].unique) {
            var query = pg.any('SELECT id FROM users WHERE login=$1', [user[i].value]).then(function (user) {
                if (user.length) {
                    errors.push('Пользователь с таким логином уже зарегистрирован');
                }
            });

            unique.push(query);
        }
    }

    return Promise.all(unique).then(function () {
        res[0].error = errors;
    });
};

И отдачу роутам нужно обернуть в then:

// неправильно

join(user, res);
// дальнейшая обработка res



// правильно

join(user, res).then(function () {
    // дальнейшая обработка res
});

Конструкция (function (i) { ... })(i); в изначальном варианте бессмысленна, потому я её убрал. А if (user[i].unique == true) { идентично if (user[i].unique) {.

Из-за того, что я не вижу полного кода могут быть ошибки.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы