2015-01-14 7 views
0

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

Так что у меня связь socketio и клиент излучает «getsettings», чтобы получить некоторые данные с помощью обратного вызова

клиент:

Socket.emit('getSettings', function (err, res) { 
    console.log('Settings retrieved'); 
    console.log(res); 
    $scope.ip = res.ip; 
    $scope.port = res.port; 
}); 

Ответ на nodejs сервер выглядит следующим образом прокомментировал это код, который не будет работать, как я надеялся.

nodejs-сервер:

socket.on('getSettings', function (placeholder, callback) { 

    console.log('Settings are broadcasted.'); 
    // this following "data" variable shall be omitted once the find() problem is solved 
    var data = { 
     ip: '192.168.188.32', 
     port: '9000' 
    }; 

    // Here I try to get the data from mongodb-database collection "lmssettings" 
    // via the mongoose-function find(). 
    // This won't work because of its async behavior 
    // 
    // lmsSettings.find({}, function (err, res) { 
    // data = res; 
    // }); 

    callback(false, data); 
}); 

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

Надеюсь, у кого-нибудь есть подсказка. Thx заранее ...

+0

Является ли переменная 'data', которая не закомментировала данные только заполнителя? – SimpleJ

+1

Поместите обратный вызов (false, data); 'внутри обратного вызова для' lmsSetting' – adeneo

+0

@adeneo Поместите свой комментарий в качестве ответа (который он), чтобы OP мог принять :) –

ответ

0

функции Асинхронной имеет функцию обратного вызова, использовать полученные данные (res) от .find обратного вызова и передать его в callback функции:

socket.on('getSettings', function (data, callback) { 

    console.log('Settings are broadcasted.'); 

    lmsSettings.find({}, function (err, res) { 
     callback(false, res); 
    }); 
}); 

Я думаю, что это должно решить вашу проблему.

+0

Damm, вот и все. У меня уже было это так. Причина, по которой это не сработало, заключалось в том, что хрюканье не было запущено на моей тестовой машине. Thx для всего – SunBob

+0

Я уже пробовал, но я буду новым для голосования. :/Hope sb else может проголосовать. Возможно, вы можете опустить «var data = {ip ...}» - часть решения. Подумайте, что он более запутанный, но полезный, потому что данные будут переопределены в функции find() в любом случае ... – SunBob

+0

Исправлено. О, я забыл об этом. Но я почти уверен, что вы можете принять ответ, это [флажок под счетчиком upvote] (http://meta.stackexchange.com/a/5235). –

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