2014-02-01 2 views
-1

У меня есть функция, как, как получить доступ к переменной функции в анонимной функции

var emailExists = function (email) { 
    mongoose.model('User', UserSchema). 
    count({ 
     email: email 
    }, function (err, count) { 
     if (err) console.log(err); 
     return count;// how can i return this count 
    }); 
}; 

в другой функции я называю emailExists

var total = emailExists(email) 
console.log(total); // this gives undefined now 

Как я могу получить возвращаемое значение из анонимной функции

EDIT: После добавления обратных вызовов из предложений ниже

var emailNotExists = function (email, _callback) { 
mongoose.model('User', UserSchema). 
    count({ 
     email: email 
    }, function (err, count) { 
     if (err) 
      return _callback(err, null); 
     return _callback(null, ((count == 0) ? true : false)); 
    }); 
}; 

Функция, где она называется

UserSchema.path('email').validate(function (email) { 
    // I need to return true or false value from this function 
    // on true the validation will success 
    // on false "Email is registered" message will get fired 
    emailNotExists(email, function (err, total) { 

     // I can retrieve the True/false value here   
     console.log(total); 
    }); 
    }, 'Email is registered'); 
+3

Является ли 'mogoose.model' асинхронной функцией? Если это так, все, что зависит от результата функции обратного вызова, должно быть выполнено _in_ обратного вызова. – Barmar

+0

@Barmar, пожалуйста, см. Мой отредактированный вопрос. Надеюсь, на этот раз я ясно. – Sami

+0

Ваш первый 'return _callback (count)' отсутствует аргумент для обратного вызова. – Barmar

ответ

3

Pass в функции обратного вызова:

var emailExists = function (email, _callback) { 
    mongoose.model('User', UserSchema). 
    count({ 
     email: email 
    }, _callback); 
}; 

Затем доступ к переменной следующим образом:

emailExists(email, function(err, total) { 
    console.log(total); 
}); 
+0

На мой взгляд, слишком много накладных расходов на то, что он хочет делать – leblma

+2

Но это правильный подход. Если обратный вызов является асинхронным, вы не можете получить немедленный доступ к результату. – Barmar

+3

@leblma - не слишком много накладных imo, и лучше, чем создание глобальной переменной, как вы предложили (imo). Здесь все содержится. –

0

Используйте этот код:

var total; 
var emailExists = function (email) { 
    mongoose.model('User', UserSchema). 
    count({ 
     email: email 
    }, function (err, count) { 
     if (err) console.log(err); 
     total = count; 
    }); 
}; 

Тогда вы можете нажать на него: console.log (всего);

+0

, это не работает. когда я консольный журнал это говорит undefined – Sami

+0

@Sami Это, вероятно, потому, что вы забыли упомянуть, что счет асинхронный. – flup

+0

@leblma жаль, что не упоминает асинхронные функции. – Sami

0

Попробуйте это.

var emailExists = function (email) { 
var result; 
    mongoose.model('User', UserSchema). 
    count({ 
     email: email 
    }, function (err, count) { 
     if (err) console.log(err); 
     result =count;// how can i return this count 
    }); 
    return result; 
}; 
+1

Это не сработает, если 'mongoose.model' запускается асинхронно, как я подозреваю. – Barmar

+0

@ kjana83 это не работает, потому что функция асинхронна – Sami

Смежные вопросы