2016-05-24 2 views
0

Прошу вас поучаствовать в этом. Кажется, я не могу понять, как я смогу обновить переменную вне функции FindOne.Как получить доступ к переменной вне функции

Итак:

var userPostCount; 

    userPostsModel.findOne({'profileID':req.session.id}, function(err, usersPostCountDB) { 
     if(usersPostCountDB){ 
      userPostCount = req.body.postsCount + 1; 
     } else { 
      console.log('There was an error getting the postsCount'); 
     } 
    }); 

Я думал, что он должен быть в состоянии найти переменную userPostCount, как это следующий уровень в цепочке областей видимости.

Любые идеи, как я смогу получить к нему доступ, пожалуйста? Мне нужна эта переменная, чтобы быть вне функции, поскольку я буду использовать ее позже для других действий мангуста.

Я получаю userPostCount как undefined.

Заранее благодарим за помощь!

PS: Я искал другие вопросы о SO, но решение по другим ответам, похоже, не работает для меня.

Шаян

+0

Возможный дубликат [Как вернуть ответ от асинхронного вызова?] (Http://stackoverflow.com/questions/14220321/how-do-return-the-response-from-an- асинхронный вызов) – idbehold

ответ

4

используйте callbacks.

function getPostsCount(callback) { 
    userPostsModel.findOne({'profileID':req.session.id}, function(err, usersPostCountDB) { 
     if(usersPostCountDB) { 
      callback(null, req.body.postsCount + 1); 
     } else { 
      console.log('There was an error getting the postsCount'); 
      callback(true, null); 
     } 
    }); 
} 

и извне называть его передачей функции обратного вызова в качестве аргумента. поэтому функция обратного вызова будет выполняться сразу после getPostsCount() возвратов (отделки) ..

getPostsCount(function(error, postsCount) { 
    if (!error) { 
     console.log('posts count: ', postsCount); 
    } 
}); 
+0

Спасибо, помощник! Я пробую это сейчас. В некоторых дополнительных проблемах не будет отмечен ваш ответ, как принято, но будет держать вас в курсе. Cheers bud –

+0

Это сработало! Большое спасибо! –

+0

Прохладный ... Привет! – narainsagar

1

Вы пытаетесь вернуть значение из функции обратного вызова. Это проще, если вы попытаетесь использовать результат внутри функции обратного вызова.

Другое, что вы можете сделать, это определить функцию и дать ей обратный вызов, где вы можете использовать значение.

function foo(fn){ 
    userPostsModel.findOne({'profileID':req.session.id}, function(err, usersPostCountDB) { 
    if(usersPostCountDB){ 
     userPostCount = req.body.postsCount + 1; 
     fn(userPostCount); 
    } else { 
     console.log('There was an error getting the postsCount'); 
    } 
}); 
} 
foo(function(userPostCount){ 
    alert(userPostCount); 
}) 

Если вы используете jquery, вы можете использовать отложенные объекты. http://api.jquery.com/category/deferred-object/

+0

Большое спасибо. Я столкнулся с некоторыми другими проблемами, поэтому обновить вас все, как только у меня получится это работать :) –

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